Кэширование элементов в ZoomX
ZoomX постепенно начинает набирать популярность. В связи с чем возникает ряд вопросов. Один из которых — кэширование элементов в шаблонизаторе Smarty. В принципе, по документации не сложно разобраться. Но, конечно, модыксерам хотелось бы работать так, как они привыкли. В этом плане Fenom из pdoTools реализован именно по этому принципу — для запрета кэширования в названии элемента указывается восклицательный знак. Всё привычно. Но работает не всегда.
Fenom, в отличие от Smarty (хоть он и сделан по его подобию), не имеет встроенного механизма управления кэшированием своих тегов. Он работает на уровне целого шаблона. Т.е. вы можете управлять кэшированием всего шаблона целиком. А все теги шаблонизатора Fenom (модификаторы, вызовы сниппетов и т.д.) останутся динамическими. Таким образом, даже в кэшированном шаблоне кэшированный сниппет всё равно будет вызван. Но его обработку перехватит шаблонизатор MODX и проверит свой кэш. И если сниппет есть в кэше, то MODX не будет его выполнять и вернёт его результат.
Всё это происходит под капотом и скрыто для простого пользователя MODX. Но пытливому разработчику хотелось бы работать по понятным правилам. И не только работать, но и понимать их. Уверен, многие хотели бы управлять кэшированием файловых элементов, к которым обычная логика с восклицательным знаком не применима.
А вот что касается Smarty, то его подход к кэшированию похож на MODX. Вполне допускаю мысль, что принцип кэширования отдельных тегов MODX перенял именно у него, исходя из того, что Smarty появился раньше и включён в MODX.
Итак, давайте подробно разберёмся и сравним как работает кэширование элементов в шаблонах в MODX и в ZoomX.
Кэширование в MODX
Чтобы элементы кэшировались, необходимо включить кэширование страницы. За это отвечает чекбокс «Кэшируемый» на странице ресурса. Теперь рассмотрим 2 варианта.
Кэширование отключено
Если ресурс не кэшируется, то соответственно не будут кэшироваться и теги кэшируемых элементов. Ведь они сохраняются в кэше страницы. А раз страница не кэшируется, то и сохранять некуда. Значит и обрабатываться они будут при каждом запросе ресурса вместе с некэшируемыми тегами.Кэширование включено
Если ресурс кэшируется, то кэшируемые теги заменяются на значения и сохраняются в кэше страницы, а некэшируемые так и остаются и будут обрабатываться при каждой загрузке страницы. Т.е. всего 2 варианта — или кэшируется навсегда или не кэшируется никогда.Кэширование в ZoomX
ZoomX отвязан от логики кэширования MODX и работает с кэшем самостоятельно. Использование восклицательного знака не поддерживается. У Smarty, который используется в качестве шаблонизатора, есть свой механизм управления кэшированием тегов. Опять же, всё зависит от режима.
Кэширование отключено
Если ресурс некэшируемый или оно отключено для всех ресурсов системной настройкой zoomx_caching, то как и в случае с MODX, закэшировать результат выполнения любого тега нельзя. Почти любого. Для сниппетов и чанков я сделал такую возможность. Для этого нужно передать в последнем параметре соответствующего модификатора передать время кэширования в секундах.{"название_сниппета"|snippet:['foo' => 'bar']:300} - кэширование на 5 минут
// если параметров нет, то время кэширования можно указать вместо них
{"название_сниппета"|snippet:0} - кэширование навсегда
// или через функцию run
{run file="название_сниппета" cache_lifetime=60}
В этом случае в папке /core/cache/zoomx/snippets/ будет создан файл кэша. Для чанков соответственно в папке /core/cache/zoomx/chunks/.
Кэширование включено
В этом случае как и в MODX необходимо указать какие теги должны остаться некэшированными. Иначе в кэш (у Smarty свой кэш) сохранятся только значения и вы получите полностью статическую страницу. Это касается любых тегов Smarty — и переменных, и модификаторов, и блоков. Чтобы оставить динамику, нужно в конце тега указать специальный атрибут nocache.{"название_сниппета"|snippet:['foo' => 'bar'] nocache}
Если нужно оставить часть страницы динамической, то эту часть нужно заключить между тегами {nocache} и {/nocache}. {nocache}
{"название_сниппета"|snippet:['foo' => 'bar']}
{auth}
Контент для залогиненных пользователей
...
{/auth}
{/nocache}
Эти элементы не будут закэшированы и будут обрабатыватся при каждом вызове. Но как и в случае некэшируемых ресурсов, вы можете использовать встроенный механизм кэширования элементов ZoomX и указать время, на которое нужно сохранить результат. Причём, данный механизм работает одинаково и для обычных элементов и для файловых.Заключение
Как видите, ZoomX предлагает более продвинутый механизм кэширования элементов, который работает как для кэшируемой страницы, так и для некэшируемой. Шаблонизатор MODX предложить подобное не могут.
Ещё хочу отметить, что ZoomX в отличие от Fenom не кэширует инлайновые чанки. Да и обычные тоже. Только ресурсы. Это существенно экономит место. Например, на этом сайте за пару месяцев кэш раздувается более 8 Гб. В результате возникали глюки из-за перерасхода разрешённого места на диске. Пришлось отключить кэширование чанков в настройках Fenom.
Поблагодарить автора
Отправить деньги
Комментарии: 5
после cut текст дублируется
Fixed
Твой компонент классный, но я все еще жду когда я смогу опробовать.
А вообще кеширование в MODX это настолько холиварная тема.
С одной стороны кеш сделали классным, а с другой стороны сохранение любого modResource дропает кеш половины сайта… что есть не клево
А вообще кеширование в MODX это настолько холиварная тема.
С одной стороны кеш сделали классным, а с другой стороны сохранение любого modResource дропает кеш половины сайта… что есть не клево
В базовой логике так. Но её можно изменить — снимаешь чекбокс «Очищать кэш» и в плагине на OnDocFormSave пишешь нужную логику. Очень гибко.
Только это не имеет большого смысла, так как с ресурсами можно работать в админке и без захода в сам ресурс, например через контекстное меню снять его с публикации, и тогда плагин не сработает, а даже если бы сработал, то в процессорах публикации/депубликации один фиг жестко прописан снос всего кэша.
Та же история с публикацией по расписанию.
Единственный вариант — это полностью переписывать реализацию класса кэш-менеджера и всех его методов.
Та же история с публикацией по расписанию.
Единственный вариант — это полностью переписывать реализацию класса кэш-менеджера и всех его методов.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.