Подсистема кеширования


НАЧАЛО >> Оглавление >> Сервер приложений ИРБИС 64/128 >> Ядро системы >> Подсистема кеширования📄 Скачать в DOCX


Подсистема кеширования предоставляет общий класс Cache для временного хранения данных, которые можно восстановить из основных источников: записей, настроек, результатов поиска, промежуточных вычислений или служебных таблиц.

Кеш не является основным хранилищем данных. Запись может быть удалена при истечении времени жизни, очистке кеша, перезапуске служб или недоступности выбранного механизма хранения. Модуль, использующий кеш, должен уметь заново получить или вычислить значение при промахе.

1. Режимы работы

Cache всегда использует быстрый локальный уровень L1 в памяти текущего PHP-процесса. Этот уровень уменьшает количество обращений к общему хранилищу во время выполнения одного запроса или фонового процесса. Для защиты от роста памяти L1 ограничен максимальным количеством элементов и очищается вместе с завершением процесса.

Если в PHP доступно расширение APCu и функция apcu_enabled() возвращает положительный результат, общим хранилищем становится APCu. Такой кеш сохраняется между HTTP-запросами и используется всеми процессами, которые работают с тем же пулом APCu. Данные удаляются по TTL, при явной очистке, при перезапуске веб-сервера или при очистке APCu средствами PHP.

Если APCu недоступен, система пытается использовать резервное SQLite-хранилище Cache.db в каталоге $OPTIONS['DataPath']. Этот режим также сохраняет данные между запросами, но зависит от доступности каталога данных для записи и от расширения PHP sqlite3. Если создать SQLite-хранилище невозможно, остается только локальный кеш текущего процесса.

Для CLI-скриптов и фоновых задач APCu считается доступным только при соответствующих настройках PHP, включая apc.enable_cli. Если настройка отключена, CLI-код будет использовать SQLite или локальный режим, даже если APCu работает для веб-запросов.

2. Пространство ключей

Внутренний ключ кеша автоматически дополняется namespace текущей инсталляции. Namespace строится из пути к коду и $OPTIONS['DataPath'], поэтому разные локальные экземпляры системы не должны читать записи кеша друг друга при общем APCu или сходной файловой структуре.

В пользовательском коде нужно задавать только логический ключ. Рекомендуемый формат - префикс модуля и назначение записи:

UseClass('Cache');

$cache = Cache::getInstance();
$cache->set('MyModule/search-result/' . $hash, $data, 3600);

$data = $cache->get('MyModule/search-result/' . $hash);

Префикс модуля снижает риск коллизий между независимыми участками кода. В ключ не следует включать нестабильные локальные пути, секреты, пароли и персональные данные, которые не нужны для восстановления кешированного значения.

3. Основные методы

Метод Назначение
Cache::getInstance() Возвращает единый экземпляр кеша.
get($key, $default = null) Читает значение по ключу или возвращает значение по умолчанию.
set($key, $value, $ttl = null) Сохраняет значение. $ttl задается в секундах или через DateInterval; 0 и null означают хранение без заданного срока истечения.
delete($key) Удаляет одну запись.
clear() Очищает кеш текущей инсталляции во всех доступных уровнях.
getMultiple($keys, $default = null) Читает несколько ключей за один вызов.
setMultiple($values, $ttl = null) Сохраняет несколько значений с общим TTL.
deleteMultiple($keys) Удаляет несколько записей.
has($key) Проверяет наличие неистекшей записи.
isCachePersistent() Возвращает true, если доступен межзапросный уровень хранения: APCu или SQLite.
getStats() Возвращает диагностическую информацию о namespace, L1, APCu и SQLite.

Значение, передаваемое в set() или setMultiple(), должно быть пригодно для хранения выбранным механизмом кеша. Для SQLite система сериализует данные перед записью; при повреждении записи кеш удаляется и при следующем обращении значение нужно восстановить из основного источника.

4. Очистка и обновление данных

Кеш нужно сбрасывать в тех местах, где меняется основной источник данных. Например, если модуль кеширует параметры, описание записи или результат вычисления, после сохранения или удаления исходной записи он должен удалить соответствующие ключи через delete() или deleteMultiple().

Полная очистка через clear() используется только для административных и диагностических сценариев. Она не должна заменять точечное удаление ключей в бизнес-логике: полный сброс может временно увеличить нагрузку на диск, БД или сервер ИРБИС 64 из-за массового пересчета данных.

5. Контроль состояния

Страница ?id=Admin/ShowCacheState показывает текущий режим работы подсистемы кеширования:

На странице также отображаются количество объектов L1, статистика APCu или размер и количество записей SQLite. Кнопка очистки вызывает Cache::clear() и удаляет кеш только в namespace текущей инсталляции.

Ошибки чтения, записи, очистки и поврежденные значения SQLite-кеша записываются через модуль Log в Cache.log, если модуль логирования доступен.

Для доступа к странице требуются права просмотра модуля Admin. Если страница недоступна, режим можно проверить из PHP-кода через Cache::getInstance()->getStats() или Cache::getInstance()->isCachePersistent().