Кэширование — очень важная часть функционирования сайта. Особенно это актуально для высоконагруженных сайтов. Поэтому любой разработчик должен его освоить.

В 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 полностью очищается при каждом сохранении ресурса, чанка, сниппета и плагина.

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

4   13120

Комментарии ()

    Вы должны авторизоваться, чтобы оставлять комментарии.

    Выделите опечатку и нажмите Ctrl + Enter, чтобы отправить сообщение об ошибке.