Cyrax_02
С нами с 04 августа 2013; Место в рейтинге пользователей: #2508 часов назад
Отличное дополнение, спасибо!
Подскажите, как организовать файл если стоит msOptionsPrice2 привязан к опции size там может быть много позиций с разн...
[YandexMarket2] интеграция с msOptionsPrice2 1
Сегодня в 00:42
Еще снова вернулась проблемка, после выбора способа доставки почтой РФ — появляется стоимость доставки, но она «прилипает» и не исчезает после переклю...
Расчет стоимости доставки msRussianPost 11
Вчера в 21:57
Лучше деинсталировать и установить новую версию. Там полностью переписан JS.
ms_CDEK2 пропал? 5
Вчера в 20:33
Фильтрация как правило предполагает точное совпадения значений, а тебе нужен поиск.
mFilter2 фильтрация tv 1
Вчера в 19:55
Все исправилось, после замены на 'parents' => $_modx->resource.id
Помогите найти ошибку в шаблоне, теги 13
Вчера в 09:31
А кто подскажет, как в форму Создания/Редактирования ресурса, через ms2Form, добавить возможность выбирать несоклько параметров в одном TV?
Ну то-ест...
Создание ресурсов из фронтенда сайта, зарегистрированными пользователями. 4
Вчера в 08:53
если правильно понял то так
{set $rows = json_decode($_modx->resource.constructor_block, true)}
{foreach $r...
getImageList. Вывести вложенный migx на fenom 1
Вчера в 08:43
Подскажите, если на странице будет две формы, они будут работать? К примеру reCaptchaV3 этого сделать не может, нужно через костыль в виде скрипта, ко...
YaSmartCaptcha - защитите ваши формы от спама умной капчей от Яндекс 5
20 ноября 2024, 16:25
В сниппете rcv3_html достаточно отложить загрузку через setTimeout (хотя кто-то делает через onClick). Не думаю что мой вариант самый правильный и что...
reCaptcha v3 - отложенная загрузка 1
19 ноября 2024, 10:51
Решил свою проблему через имя пользователя, но хотелось бы через права пользователя «Неограниченные права»
<?php
/**
* Системное событие OnMan...
Редактирование контекста в мультидоменном сайте 1
Плюс сразу парсить элементы по мере их «поступления» не нужно. Лучше их распарсить в самом конце после полного разворачивания элементов за один раз. так будет гораздо быстрее.
Но при создании плагина (даже пустого) время генерации страницы увеличивается на полсекунды из-за большого числа вызовов этого плагина. Т.е. вариант с OnParseDocument отпадает…
Иногда на парсинг этих 150 тегов уходит 0.10-0.15 сек, иногда 0.05 сек, временами 0.3-0.4 сек.
В файле /core/model/modx/modparser.class.php внутрь метода processTag (строка 414) ставим 3 заглушки:
Далее в файле /core/model/modx/modelement.class.php внутрь метода process (строка 263) ставим ещё 2 заглушки:
Загружаем страницу и получаем цифры:
[before process] 0.0023
[start process] 0.0024
[end process] 0.0032
[after process] 0.0436
Т.е наблюдается большой скачок времени (0.04 сек) между лапками [end process] и [after process]. Этот промежуток времени соответствует возврату из метода modElement::process() обратно в метод modParser::processTag(), откуда он был вызван.
Временной провал локализован и составляет 0.04. Осталось это чудо объяснить.
Явно modx что-там делает усиленно. Причём временами эти его действия занимают много времени (0.3 сек), временами — мало (0.03 сек).
Причём ошибок замеров здесь нет, потому что общее время генерации скрипта, выводимое через тег [^t^], также увеличилось на 0.3 сек. Т.е. время парсинга сниппета (без выполнения кода) на самом деле тормозит.
Попробую поковыряться в исходниках…
— время выполнения кода сниппета: 0.01-0.02 сек
— время парсинга сниппета, показанное debugParser: 0.07-0.30 сек
— разница между временем парсинга и временем выполнения кода: 0.05-0.28 сек
Т.е. сегодня в течение 3-4 часов время парсинга менялось в довольно широком диапазоне 0.05-0.30 сек, при этом время выполнения сниппета не менялось и всё время составляло 0.01-0.02 сек.
Но даже если взять минимальное время парсинга (0.04 сек), то всё равно чисто на парсинг (без выполнения) уходит слишком много времени — 0.05 сек. При этом чтение include-файла сниппета core/cache/includes/elements/modsnippet/xxx.include.cache.php выполняется за тысячные доли секунды.
А «виснуть» админка будет только при вызове этого плагина. Если при загрузке некоторой страницы сайта или админки плагин с синтаксической ошибкой не вызывается, то и проблем никаких не будет.
И сравните время парсинга сниппета с этими 10000 строками кода и без них.
А код возьмите полегче, чтобы быстро выполнялся, например:
Сниппет без кода парсится: 0.0052 сек.
А теперь вопрос: куда подевались 0.02 сек?
Чтение include-файла сниппета с 3500 строками кода занимает тысячные (у Вас — десятитысячные) доли секунды.
Т.е. в случае с 3500 строками кода чисто парсинг (без выполнения) длится на 0.02 сек дольше, чем парсинг пустого (или почти пустого) сниппета.
Учитывая, что у меня сервер слабый (работает в 20-40 раз медленнее, чем тот сервер, на котором работает Василий), можете умножить Ваши цифры на 10 и получите тот же масштаб цифр (0.3 сек и 0.075 сек соответственно)
А теперь уберите все 3500 строк и посмотрите, сколько будет парситься почти пустой сниппет.
community.modx-cms.ru/blog/questions/199388.html#comment77053
Но на скорость загрузки страницы это никак не повлияло (разве что на 0.05 сек, не более). И тем более, никак не повлияло на сабжевую проблему.
Наберите в сниппете любой левый код на 3000 строк (который выполняется быстро) и запустите debugParser. Получите приличное время для этого сниппета.
Но если в сниппете snp01 весь код оставить, но вместо
поставить
то время парсинга сниппета нисколько не уменьшается — также 0.3 сек
Следовательно, 0.3 сек уходит НЕ на парсинг возвращаемого сниппептом html-кода.
P.S. Т.е. время парсинга некэшируемого сниппета приблизительно пропорционально текстовому объёму кода этого сниппета и не зависит от возвращаемого сниппетом значения. И коэффициент пропорциональности имеет приличную величину.
В итоге время парсинга сниппета уменьшилось с 0.3 сек до 0.002 сек
Как такое может быть? Напрашивается вывод, что modx очень тщательно парсит код сниппета. Но чего там парсить? Ведь в сниппетах нет modx-тегов — только php-код и всё.
Единственной разницей во времени парсинга должна быть разница между чтением с диска маленького файла и большого — а это тысячные и сотые доли секунды соответственно. Де факто получаем разницу в 0.3 сек.
В частности, переименовывать элементы сейчас — жуть. Вручную по всем шаблонам, чанкам, сниппетам и ctrl+F. А можно было бы за секунду.
Далее в коде делаем так (кэшируем состояние объекта xPDOQuery):
Тест (1 TV и 2 простых условия):
При первом выполнении (запрос строится с нуля): 0.005-0.007 сек
При последующих выполнениях (объект xPDOQuery восстанавливается из файлового кэша): 0.0007 сек (из них 0.0005 сек — чтение кэш-файла с состоянием xPDOQuery)
Разница: в 7-10 раз. И это только на простом запросе (1 tv и 2 условия).
Мой запрос с 30 tv-ками и кучей сложных условий готовится (без выполнения) 0.1 сек.
С кэшированием запроса вплоть до пагинации (до добавления limit/offset) — 0.0007-0.0010 сек
Разница: в 70-100 раз.
P.S. Кэширование запроса xPDOQuery совместно с его выполнением в режиме pdo может придать ему реактивные свойства. И переписывать запрос на чистый pdo не потребуется.
xPDOQuery_mysql extends xPDOQuery extends xPDOCriteria
Самый простой вариант — засериализовать все поля объекта xPDOQuery_mySQL. Проблема в том, что открытыми являются только поля класса xPDOCriteria:
Собственные же поля класса xPDOQuery являются защищёнными.
Соответственно, единственным способом вручную засериализовать поля объекта xPDOQuery (xPDOQuery_mysql) остаётся наследование. Что-то вроде такого:
Но в этом случае также потребуется заставить метод xpdo->newQuery вместо xPDOQuery_mysql создавать объект класса xPDOQueryManager_mysql. Опять-таки заставить можно, только перегрузив класс modx и метод newQuery. И это не всё. Нужно ещё заставить modx в процессе инициализации вместо modx использовать перегруженный класс modxManager. Но это уже попахивает извращением.
В голову лезет ещё вариант с reflection. Может, к утру что-нибудь придумаю…
Отделяем мух от котлет:
Если по замыслу разработчиков include-код имеет отношение к кэшу элемента (т.е. является кэшем include-кода), то этот кэш include-кода вообще НЕ должен использоваться при вызове НЕкэшируемого элемента.
Если же по замыслу разработчиков include-код является include-вариантом текущего кода элемента, то он всегда должен поддерживаться в актуальном состоянии (т.е. обновляться при обновлении исходного кода элемента).
Сейчас же мы наблюдаем смешанную логику:
В ходе обработки НЕкэшируемого элемента парсером modx этот файл выступает в качестве include-варианта текущего кода элемента. А при изменении исходного кода сниппета — в качестве кэша include-кода.
Такого быть не должно. Логика должна быть однозначной — либо это кэш-side, либо не кэш-side.
Ну ведь очевидно, что разработчики modx реализовали именно такой вариант работы парсера (не eval'ом из БД, а include'ом из внешнего файла) не для того, чтобы синхронизировать раздельную работу разработчиков.
Ваш пример всего лишь показывает, как с пользой можно использовать эту «особенность» modx.
Всё-таки цель этой галки несколько иная. Не обеспечение целостности данных (целостность данных должна обеспечиваться всегда, везде и в безусловном порядке, а если нужны варианты данных на разные моменты времени, здесь уже вводим категории снимков данных, кэша, версий и пр.), а актуализация кэша (в силу реализации новые кэш-данные физически будут созданы при первом вызове, но смысл именно такой).