Кэширование
Последнее обновление Jan 27th, 2020 | История страницы | Улучшить эту страницу | Сообщить о проблеме
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn moreКэшируя повторно используемые данные, можно предотвратить множество запросов к базе данных, что приведет к повышению производительности. 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
.
Обратите внимание, что в MODX 2.0.x система кэша довольно сильно отличалась. Доступные разделы были иными, а системные настройки сохранялись в core/cache/config.cache.php
. Если вы все еще используете MODX 2.0.x, вам следует потратить больше времени на обновление и меньше времени на чтение этого документа.
Кэширование базы данных¶
Если вы включите системный параметр 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');
Пример 2. Добавление и получение кэша из пользовательского раздела¶
$str = 'Мои тестовые данные для кэша.';
$options = array(xPDO::OPT_CACHE_KEY=>'mypartition',);
// Записываем данные в раздел кеша по умолчанию со сроком действия 2 часа.
$modx->cacheManager->set('testdata', $str, 7200, $options);
// Получаем данные из кеша снова. Возвращается ноль, если кеш недоступен или срок его действия истек.
$str = $modx->cacheManager->get('testdata', $options);
Обратите внимание в Revolution 2.0¶
В MODX Revolution 2.0 была другая система кеширования с отличающимися разделами. Чтобы очистить кеш в 2.0, вы должны использовать метод clearCache()
, который устарел с 2.1. Лучше обновиться до последней версии, чем продолжать использовать 2.0.
// Очищаем всё по умолчанию (все файлы с расширением .cache.php
// в cachePath + все кэши объектов)
$modx->cacheManager->clearCache();
// очищаем только файлы кэша с расширением .php или .log в путях web/, custom/
// или logs/; объекты не очищаются
$paths = array('web/', 'custom/', 'logs/');
$options = array('objects'=>null, 'extensions'=> array('. php', '.log'));
$modx->cacheManager->clearCache($paths, $options);
// очищаем все файлы кеша с расширением .php в cachePath
// + все объекты + выполняем проверки по времени публикации
$paths = array('');
$options = array('objects'=>'*', 'publishing'=>true, 'extensions'=>array('. php'));
$modx->cacheManager->clearCache($paths, $options);
Support the team building MODX with a monthly donation.
The budget raised through OpenCollective is transparent, including payouts, and any contributor can apply to be paid for their work on MODX.
Backers
Budget
$301 per month—let's make that $500!
Learn more