Кэширование элементов в 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.
Сергей Шлоков
17 апреля 2022, 12:38
modx.pro
2
338
+16
Поблагодарить автора Отправить деньги

Комментарии: 5

Андрей Степаненко
18 апреля 2022, 07:09
+1
после cut текст дублируется
Павел Бигель
19 апреля 2022, 03:16
0
Твой компонент классный, но я все еще жду когда я смогу опробовать.
А вообще кеширование в MODX это настолько холиварная тема.
С одной стороны кеш сделали классным, а с другой стороны сохранение любого modResource дропает кеш половины сайта… что есть не клево
    Сергей Шлоков
    19 апреля 2022, 06:35
    0
    В базовой логике так. Но её можно изменить — снимаешь чекбокс «Очищать кэш» и в плагине на OnDocFormSave пишешь нужную логику. Очень гибко.
      Sem
      Sem
      19 апреля 2022, 16:40
      0
      Только это не имеет большого смысла, так как с ресурсами можно работать в админке и без захода в сам ресурс, например через контекстное меню снять его с публикации, и тогда плагин не сработает, а даже если бы сработал, то в процессорах публикации/депубликации один фиг жестко прописан снос всего кэша.
      Та же история с публикацией по расписанию.
      Единственный вариант — это полностью переписывать реализацию класса кэш-менеджера и всех его методов.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5