Кэширование в MODX
Кэширование — очень важная часть функционирования сайта. Особенно это актуально для высоконагруженных сайтов. Поэтому любой разработчик должен его освоить.
В MODX управление кэшированием разделено на 3 уровня — административный, пользовательский и программный. Я хотел бы подробнее рассмотреть последний. Тем более это актуально при использовании подхода программирования, описанного в прошлой статье. Поэтому по первым двум пробежимся быстренько.
Итак, за первый уровень отвечает администратор сайта. Он настраивает кэширование для всего сайта. Делается это в системных настройках: раздел — core, подраздел — кеширование.
На пользовательском уровне кэширование уже настраивается для каждого ресурса и элемента (чанка, сниппета, плейсхолдера) в отдельности. У ресурса есть специальный чекбокс «Кешируемый». Если его отключить, то страница кэшироваться не будет. А для отключения кэширования элементов используется специальный флаг — восклицательный знак, который добавляется в тег перед названием элемента:
// Некэшируемый сниппет [[!snippet]] // Некэшируемый чанк [[!chunk]] // Некэшируемый плейсхолдер системной настройки [[!++system_setting]]
А вот теперь давайте подробнее остановимся на программном уровне. MODX использует разные разделы (partitions) для хранения разных типов данных. Разделы — это подпапки в папке core/cache/
. Вот их список:
- action_map
- auto_publish
- context_settings
- default
- includes
- lexicon_topics
- logs
- menu
- namespaces
- mgr
- registry
- resource
- rss
- scripts
- system_settings
Я не буду подробно описывать для чего каждая папка нужна. Прочитать об этом можно в документации. Как правило, вам не придется напрямую работать с этими разделами. Вместо этого, для работы со своими данными, нужно будет освоить API кэширования.
Информация!
В MODX есть крутая возможность указывать для каждого раздела свой провайдер (handler). По-умолчанию, MODX использует файловый менеджер xPDOFileCache. Но кроме него доступны и другие провайдеры — xPDOAPCCache (для APC), xPDOMemCache (для memcache), xPDOMemCached (для memcached) и xPDOWinCache (для WinCache).
Чтобы указать другой провайдер для конкретного раздела, нужно создать системную настройку с названием cache_НАЗВАНИЕ_РАЗДЕЛА_handler и указать соответствующий класс провайдера. Например, чтобы подключить APC менеджер для ресурсов, создаём настройку cache_resource_handler и указываем в ней класс xPDOAPCCache.
Также для каждого раздела можно указать и другие настройки — cache_НАЗВАНИЕ_РАЗДЕЛА_key и cache_НАЗВАНИЕ_РАЗДЕЛА_expires.
Давайте рассмотрим как сохранять и получать свои данные в кэше. Для этого у кэш менеджера MODX (класс modCacheManager
), который наследуется от базового класса xPDOCacheManager
, есть соответствующие методы — get()
, set()
, delete()
и refresh()
. Начнём с самого простого.
// Массив в данными пользователя $userData = array('user'=>$modx->user->get('username'), 'ip'=>$_SERVER['HTTP_CLIENT_IP'], 'city'=>'Москва'); // Записываем данные в раздел default с ключом userdata. $modx->cacheManager->set('userdata', $userData); ... // Получаем значение по ключу userdata $user = $modx->cacheManager->get('userdata');
Если зайти в папку core/cache/default/
, то можно увидеть созданный файл userdata.cache.php
, в котором хранится массив с данными пользователя. Если раздел не указан (как в нашем случае), то данные сохраняются в папку default
.
Теперь давайте ограничим время хранения наших данных.
// Массив в данными пользователя $userData = array('user'=>$modx->user->get('username'), ip=>$_SERVER['HTTP_CLIENT_IP'], 'city'=>'Москва'); // Указываем время хранения в секундах. $modx->cacheManager->set('userdata', $userData, 3600); ... // Пробуем получить наши данные. Если время истекло, то метод вернёт null if (!$user = $modx->cacheManager->get('userdata')) { /* Формируем заново данные пользователя */ }
Но всё-таки удобнее хранить пользовательские данные в специальной папке (разделе). Для этого нужно указать соответствующий параметр cache_key
.
// Массив в данными пользователя $userData = array('user'=>$modx->user->get('username'), ip=>$_SERVER['HTTP_CLIENT_IP'], 'city'=>'Москва'); // Указываем свою папку для хранения пользовательских данных $options = array( xPDO::OPT_CACHE_KEY => 'users_data', ); $userId = $modx->user->get('id'); // Указываем в качестве ключа id текущего пользователя. Время хранения не ограничиваем (указываем 0). $modx->cacheManager->set($userId, $userData, 0, $options); ... // Пробуем получить данные для текущего пользователя. $user = $modx->cacheManager->get($modx->user->get('id'), array(xPDO::OPT_CACHE_KEY=>'users_data')); // Если хранение данных ограничено и время истекло, то метод вернёт null. Поэтому проверяем так if (!$user = $modx->cacheManager->get($modx->user->get('id'), array(xPDO::OPT_CACHE_KEY=>'users_data'))) { /* Формируем заново данные пользователя */ }
Теперь в папке core/cache/
создалась папка users_data
и в ней появляются файлы типа 1.cache.php
, 5.cache.php
и т.д. Т.е. теперь для каждого пользователя создается свой кэш с данными.
Если нужно удалить из кэша данные конкретного пользователя, то для этого используется метод delete()
$modx->cacheManager->delete($userId, array(xPDO::OPT_CACHE_KEY=>'users_data'));
А вот чтобы очистить весь кэш или целый раздел используется метод refresh()
.
// В массиве указываем разделы, которые нужно очистить. Если ничего не указать, то очиститься кэш всего сайта. $modx->cacheManager->refresh(array( 'users_data' => array(), 'context_settings' => array('contexts' => array('web')), // удаляем только настройки для контекста web ));
Информация!
Имейте ввиду, что папка default
полностью очищается при каждом сохранении ресурса, чанка, сниппета и плагина.
Вот в общем-то и всё. Полученные знания вы можете применять для кэширования файловых элементов.
Вы должны авторизоваться, чтобы оставлять комментарии.
Комментарии ()