Наверх

[Перевод] Оптимизация сайта с помощью getCache или работа с пользовательскими разделами кеша

Перевод статьи Джейсона Коварда (opengeek) Optimization with getCache and Custom Cache Partitions

Проблема: При любом действии в админке, очищается кеш всего сайта



Одной из самых распространенных претензий к системе кеширования MODX Revolution является очистка всего кеша сайта при любом действии в админке (будь то редактирование ресурса, чанка, сниппета и пр. — даже просто при создании нового чанка). В результате скорость загрузки сайта уменьшается, так как все сниппеты, чанки и шаблоны необходимо снова обрабатывать. Многие высказываются, что они хотят очищать кеш только отредактированного ресурса. На первый взгляд это выглядит как баг, а не как фича. Кажется, что в такой продвинутой и гибкой системе, как MODX, довольно просто реализовать очистку кеша только тех элементов, которых коснулись изменения.

В этой статье я хотел бы получше объяснить, во-первых, почему так трудно реализовать такую частичную очистку кеша, а во-вторых, на примере показать альтернативный способ решения проблемы без необходимости разработки решений с нуля.

Препятствие: Зависимости кеша неструктурированы



Именно из-за гибкости MODX, обновление кеша только измененных элементов становится непростой задачей. Вы можете делать что угодно в пределах ресурсов или элементов MODX, и поэтому пытаться предсказать, какие ресурсы и элементы зависят от конкретного изменения просто невозможно в общем случае.

Несмотря на то, что в MODX существуют широкие возможности по управлению очисткой кеша для более точной настройки того, что будет удаляться из кеша, а что — нет, для вас, как разработчика, лучшим решением будет разработка стратегии кеширования с учетом специфики сайта и предполагаемой частоты внесения изменений.

Таким образом, если мы примем за факт, что неструктурированные зависимости, присущие сайтам MODX не позволяют легко вычислить, где, когда и какие части кеша обновить, и что MODX и так уже делает все возможное для более эффективной обработки зависимостей кеша, нашим следующим шагом будет — найти лучший способ обойти это препятствие.

Обходим препятствие: Оптимизация сайта с помощью getCache



Сниппет getCache, который я разработал пару лет назад, после релиза MODX Revolution, наряду с возможностью создавать и использовать пользовательские разделы кеша в версиях старше 2.1, обеспечивает один из кратчайших путей обхода нашей проблемы.

Это расширение MODX позволяет кешировать вывод любого элемента в уникальный раздел кеша на основе названия элемента, его свойств и любых параметров запроса, который вызывает getCache.

Кроме того, getCache позволяет точно указать, где, как и сколько времени хранить кэш данного конкретного элемента. Воспользовавшись этим расширением, вы можете не думать о разработке стратегии кэширования вашего сайта MODX, а просто кэшировать вывод ресурсоемких или просто «тяжелых» элементов за пределами стандартных разделов кэша.

Посмотрим на простой пример использования getCache, который поможет уменьшить время загрузки ресурсов независимо от того, как часто вы вносите изменения на сайте.

[[!getCache@myGetResourcesPropertySet?
   &element=`getResources`
   &cacheKey=`persist_forever`
   &cacheExpires=`0`
   &parents=`[[*id]]`
]]
Давайте, разберемся, что же происходит при его выполнении:

  1. Вычисляется уникальный хэш для запроса на основе имени элемента, его свойств, и всех параметров $_REQUEST. Кроме того, вы можете задать свое имя для раздела кеша, используя параметр &cacheElementKey.
  2. getCache проверяет, существуют ли данные в разделе кэша, указанном в параметре &cacheKey, т.е. persist_forever.
  3. Если данные в кеше есть и их время жизни еще не истекло (&cacheExpires=`0` означает, что оно никогда не истекает), getCache выводит их, если нет — обрабатывает элемент как обычно, кеширует и выводит.

Довольно простой метод, который, однако, снижает нагрузку. А если изменения вносятся часто и кэш ресурсов постоянно очищается, разница в производительности может быть просто невероятной. Вывод элементов, которые вы кешируете с помощью getCache можно хранить постоянно, или пока вы не решите его очистить. Таким образом, getCache дает вам возможность невероятно точно контролировать практически любой аспект кэширования вашего сайта.

Вы можете найти всю информацию по сниппету getCache здесь:

Продолжение приключений: Когда и как мы можем обновлять данные в пользовательских разделах кеша



Итак, теперь мы знаем, что можем хранить кеш элементов за пределами основного раздела кеша, благодаря чему он не будет удаляться при любом действии в админке.

Теперь давайте подумаем, когда данные в пользовательских разделах кеша должны очищаться? Несомненно только тогда, когда это нужно нам — людям. Соответственно очистку пользовательских разделов кеша можно повесить, например, на событие OnSiteRefresh или создать отдельный пункт меню в админке для очистки именно пользовательского кеша. Если вы хотите еще большей автоматизации, вам придется самостоятельно определить при редактировании каких элементов пользовательский кеш должен очищаться, и соответственно настроить его очистку.

И еще раз:
Большая сила налагает большую ответственность!

Ну и на последок ссылки:

Оригинал статьи community.modx-cms.ru/blog/documentation/9033.html

1 комментарий

  1. Артур Костюнин 20 мая 2013, 21:24(Комментарий был изменён) # 0
    Подскажите как можно воспользоваться getCache в дополнении Artcles.
    т.к. при выводе используются только свои вызовы ([[+articles]] и [[+paging]]).

    Спасибо.

    Авторизация

    через сервис Loginza:

    Подписка или RSS

    Буду присылать новые статьи — никакого спама



    Шаблоны MODX

    1 2 Дальше »

    Объектная
    модель
    MODX