Кэшируя повторно используемые данные, можно предотвратить множество запросов к базе данных, что приведет к повышению производительности. MODX Revolution предлагает ряд различных функций кэширования на разных уровнях в приложении. Кэширование в MODX в основном обрабатывается базовым классом modCacheManager
, который расширяет класс xPDOCacheManager
и позволяет использовать обработчики кэша, зависящие от раздела. Реализация по умолчанию записывает кэши в файлы в папке core/cache/
.
Если вы определили пользовательский ключ MODX_CONFIG_KEY
, менеджер кэша выполнит запись в core/cache/MODX_CONFIG_KEY/
Общая терминология кэширования и поведение
MODX использует разные разделы для отдельных типов кэшируемых данных. Упрощенно, раздел — это папка в директории core/cache/
, но настоящая ценность разделов в том, что каждому разделу могут быть назначены разные обработчики кэша. Обработчики кэша являются производными от класса xPDOCache
и предоставляют единый API для хранения, чтения и удаления записей кэша.
Обработчик кэша по умолчанию xPDOFileCache
записывает кэш в файловую систему в папкеcore/cache/
, но в ядре доступны также другие обработчики кэша для APC (xPDOAPCCache
), memcache(d)
(xPDOMemCache
, xPDOMemCached
) и WinCache
(xPDOWinCache
).
Разделы основного кэша MODX
В ядре несколько разделов. Их можно легко определить, просмотрев папку core/cache/
с конфигурацией кэша по умолчанию.
Обычно вам не нужно работать с кэшированными данными напрямую (вместо этого используйте доступные API), но для понимания ядра MODX здесь мы рассмотрим основные разделы и кратко опишем их назначение и содержание.
Как мы обсудим позже, пользовательские провайдеры также могут быть использованы в разработке.
- action_map содержит большой массив всех действий (идентификаторов, ссылающихся на контроллеры и пространства имен), которые могут быть доступны в менеджере. Поскольку действия устарели и больше не используются в 2.3, никогда не полагайтесь на них.
- auto_publish содержит метку времени Unix, которая определяет, когда ресурс должен быть автоматически опубликован или распубликован (см.
ModCacheManager.autoPublish()
) - context_settings для каждого контекста на сайте содержит карту ресурсов (идентификаторы родительских и дочерних документов), карту псевдонимов, используемые в контексте плагины и политики доступа.
- db раздел кэша базы данных используется, когда включена системная или контекстная настройка
cache_db
, и содержит необработанные наборы результатов для запросов xPDOgetObject
/getCollection
. Подробнее об этом ниже. - includes — на самом деле, это не раздел кэша, но он содержит файлы PHP, где сниппеты и плагины заключены в вызовы функций для легкого выполнения ядром. Смотрите сценарии для раздела кэша для сниппетов и плагинов.
- logs — это также не раздел кэша, но содержит файл error.log и иногда другие файлы журнала (например, журнал установки).
- menu cодержит для каждого языка менеджера многомерный массив верхнего меню менеджера.
- mgr не является настоящим разделом кэша, но используется Smarty и Google Minify в 2.2 для записи файлов кэша.
- registry — это директория по умолчанию для modRegistry, в которую записываются журналы регистрации файлов. Не является настоящим разделом кэша.
- resource содержит организованный по контексту и идентификатору ресурса механизм частичного кэширования ресурсов. Эти файлы кэша содержат метаданные для ресурса, кэшированное представление ресурса (_content) с оставшимися без кэширования тегами, политиками доступа к ресурсу и элементами и их источниками, используемые при обработке ресурса.
- rss не является настоящим разделом кэша, но используется MagpieRSS (виджеты RSS панели) для записи в кеш.
- scripts содержит источник сниппетов и плагинов, которые впоследствии записываются в папку кэша includes.
- setup не является настоящим разделом кэша, но используется инсталлятором MODX для кэширования шаблонов Smarty.
- system_settings содержит глобальную конфигурацию MODX и системные настройки. Этот раздел загружается первым по запросам в MODX. Поскольку альтернативные обработчики кэша для разделов хранятся в системных настройках, этот раздел не может быть загружен из другого обработчика кэша таким образом.
Чтобы изменить обработчик кэша для определенного раздела кэша, просто создайте новый системный (или контекстный) параметр с именем cache_PARTITION_handler
(например, cache_resource_handler
или cache_scripts_handler
) и присвойте ему значение обработчика кэша, который вы хотели бы использовать. По умолчанию используется xPDOFileCache
, однако и другие обработчики доступны для APC
, memcache
(d) и wincache
.
Кэширование базы данных
Если вы включите системный параметр cache_db, MODX может автоматически кэшировать наборы результатов базы данных, извлеченные любым экземпляром xPDOCriteria
или xPDOQuery
. Это включает в себя все наборы результатов, представляющие xPDOObjects
или коллекции xPDOObjects
, возвращаемые такими методами, как getObject
и getCollection
.
Эта функция может быть включена в средах, где доступ к базе данных обходится дороже, чем время подключения файлов PHP, например, при использовании внешнего сервера базы данных, или настраивается для сред с доступным memcached
, APC
или другими системами кэширования. Это отдельный раздел кеша в MODX, поэтому его можно настроить с другими обработчиками кэша. Смотрите xPDO Caching для дополнительной информации.
Обновление кэша MODX Core
Чтобы обновить любой из основных разделов кэша MODX, используйте метод modCacheManager->refresh()
. Минимальный вызов не имеет параметров и обновит все разделы основного кэша.
$modx->cacheManager->refresh();
Кроме того, вы можете определить массив $providers
с разделом элементов key => $partitionOptions
.
// Обновить только настройки контекстов web и web2
$modx->cacheManager->refresh(array('context_settings'=>array('contexts'=> array ('web', 'web2')));
Второй параметр $results
передается по ссылке и будет содержать результаты каждого раздела кэша. В зависимости от раздела это может быть логическое значение или массив с дополнительной информацией о результате обновления определенного раздела. Сама функция возвращает логическое значение, указывающее, вернул ли какой-либо из разделов логическое значение false
.
Программное (пользовательское) кэширование
Взаимодействуя с modCacheManager
, вы можете легко кэшировать данные любого типа. Есть несколько полезных функций, которые вы можете использовать для поддержания рабочего кэша. Используя modCacheManager
с пользовательским разделом (хотя и необязательно), пользователи вашего кода могут изменить обработчик кэша и сохранить данные в экземпляре memcached
, APC
или WinCache
вместо файлового кэша по умолчанию.
ModCacheManager
(производный от xPDOCacheManager
) предоставляет следующие полезные методы:
add($key, $var, $life = 0, $options = array())
используется для добавления значения в кэш, но только если оно еще не существует или срок его действия истек.replace($key, $var, $life = 0, $options = array())
используется для замены существующего кэшированного значения другим.set($key, $var, $life = 0, $options = array())
используется для установки значения в кэш независимо от того, существует ли оно уже (перезаписывается) или нет (добавляется).delete($key, $options = array())
удаляет кэшированное значение из кэша.get($key, $options = array())
получает кэшированное значение из кэша.clean($options = array())
очищает (удаляет) весь поставщик кэша. Убедитесь, что вы определилиxPDO::OPT_CACHE_KEY
в массиве параметров.
В общем случае вы можете использовать get($key)
и set($key, $value)
для получения и установки значений соответственно, но дополнительные методы обеспечивают дополнительный контроль над способом управления данными.
Массив $options
может содержать следующие параметры, указывающие раздел кэша для записи, используемый обработчик кэша и время истечения по умолчанию.
xPDO::OPT_CACHE_KEY
— раздел кэша для записи.xPDO::OPT_CACHE_HANDLER
— используемый обработчик кэша. Как правило, вам не нужно жестко определять этот параметр, но имеет смысл разрешать конкретной реализации обрабатывать обработчик кэша с помощью системных настроек (то есть системных настроекcache_PARTITION_handler
).xPDO::OPT_CACHE_EXPIRES
— время истечения по умолчанию.
Пример 1: Простое добавление и получение кэша
$str = 'Мои тестовые данные для кэша.';
// Записываем данные в раздел кеша по умолчанию со сроком действия 2 часа.
$modx->cacheManager->set('testdata', $str, 7200);
// Получаем данные из кеша снова. Возвращается ноль, если кеш недоступен или срок его действия истек.
$str = $modx->cacheManager->get('testdata');