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

В MODX управление кэшированием разделено на 3 уровня — административный, пользовательский и программный. Я хотел бы подробнее рассмотреть последний. Тем более это актуально при использовании подхода программирования, описанного в прошлой статье. Поэтому по первым двум пробежимся быстренько.

Итак, за первый уровень отвечает администратор сайта. Он настраивает кэширование для всего сайта. Делается это в системных настройках: раздел — core, подраздел — кеширование.

На пользовательском уровне кэширование уже настраивается для каждого ресурса и элемента (чанка, сниппета, плейсхолдера) в отдельности. У ресурса есть специальный чекбокс «Кешируемый». Если его отключить, то страница кэшироваться не будет. А для отключения кэширования элементов используется специальный флаг — восклицательный знак, который добавляется в тег перед названием элемента:

// Некэшируемый сниппет
[[!snippet]]
// Некэшируемый чанк
[[!chunk]]
// Некэшируемый плейсхолдер
[[!+placeholder]]

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

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

    28 мая 2016, 20:29   4994     0

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

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

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