Обычное кэширование по времени (CPHPCache, Bitrix\Main\Data\Cache) отлично работает, но у него есть недостаток: если данные изменились, кэш обновится только по истечении своего TTL (времени жизни).
Пользователи будут видеть устаревшую информацию.
Для решения этой проблемы в Битрикс существуют два мощных механизма: управляемый (managed) и тегированный (tagged) кэш.
1. Управляемый кэш (ManagedCache)
Идея: Привязать кэш не ко времени, а к определенной сущности (например, «инфоблок 5», «пользователь 10»). Когда эта сущность изменяется (например, обновляется элемент в инфоблоке 5), Битрикс автоматически сбрасывает весь кэш, связанный с этой сущностью.
Как использовать:
Для работы с управляемым кэшем используется объект Application::getInstance()->getManagedCache().
use Bitrix\Main\Application;
$cache = Application::getInstance()->getManagedCache();
$cacheId = 'my_component_cache_id';
$cacheDir = '/my_component/managed/';
$cacheTime = 3600;
// Указываем, что кэш зависит от инфоблока с ID=5
$cacheTag = "iblock_id_5";
if ($cache->read($cacheTime, $cacheId, $cacheTag)) {
$arResult = $cache->get($cacheId); // Получаем данные
} else {
// --- Получаем данные из БД ---
$arResult = ...;
// ----------------------------
$cache->set($cacheId, $arResult); // Сохраняем данные в кэш
}
- read($ttl, $id, $tag): Пытается прочитать кэш. Третий параметр — это тег (в данном случае, системный тег инфоблока).
- set($id, $vars): Сохраняет переменные в кэш.
Теперь, при любом изменении в инфоблоке №5 (добавление/изменение/удаление элемента или раздела), Битрикс автоматически сбросит этот кэш.
2. Тегированный кэш (TaggedCache)
Идея: Управляемый кэш хорош, но что, если наш компонент выводит данные из нескольких сущностей? Например, список статей (инфоблок 1) и имена их авторов (пользователи). Если изменится имя автора, кэш статей не сбросится.
Тегированный кэш позволяет «пометить» кэш любым количеством произвольных тегов. Затем можно сбросить кэш по любому из этих тегов.
Как использовать:
Это самый мощный и рекомендуемый способ. Он интегрирован в CPHPCache и Bitrix\Main\Data\Cache.
Шаг 1: Начинаем кэширование и регистрируем теги
use Bitrix\Main\Data\Cache;
use Bitrix\Main\Application;
$cache = Cache::createInstance();
$cacheId = 'articles_with_authors';
$cacheDir = '/articles/list/';
$cacheTime = 3600;
if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
$arResult = $cache->getVars();
} elseif ($cache->startDataCache()) {
// Получаем объект для работы с тегами
$taggedCache = Application::getInstance()->getTaggedCache();
$taggedCache->startTagCache($cacheDir);
// Регистрируем общий тег для инфоблока
$taggedCache->registerTag('iblock_id_1'); // Тег для инфоблока "Статьи"
$arResult = [];
// --- Получаем данные (статьи и авторов) ---
// ...
// В цикле по статьям регистрируем тег для каждого автора
foreach ($articles as $article) {
$taggedCache->registerTag('user_id_' . $article['AUTHOR_ID']);
$arResult[] = $article;
}
// ------------------------------------------
$taggedCache->endTagCache(); // Завершаем регистрацию тегов
$cache->endDataCache($arResult);
}
- startTagCache(): Начинает «слушать», какие теги будут зарегистрированы.
- registerTag(‘my_tag’): «Помечает» текущий кэш тегом.
- endTagCache(): Завершает регистрацию.
Теперь наш кэш зависит от инфоблока №1 и от каждого автора, чья статья попала в выборку.
Шаг 2: Сбрасываем кэш по тегу
Сброс нужно выполнять в обработчике события, которое соответствует изменению данных. Например, если изменился пользователь, нужно сбросить кэш по тегу user_id_….
// В /local/php_interface/init.php
// Вешаем обработчик на событие после обновления пользователя
AddEventHandler("main", "OnAfterUserUpdate", "clearUserTaggedCache");
function clearUserTaggedCache(&$arFields)
{
if (isset($arFields['ID']) && $arFields['ID'] > 0) {
// Если изменились поля, которые могут влиять на отображение
if (isset($arFields['NAME']) || isset($arFields['LAST_NAME'])) {
// Сбрасываем кэш по тегу этого пользователя
Application::getInstance()->getTaggedCache()->clearByTag('user_id_' . $arFields['ID']);
}
}
}
- clearByTag(‘my_tag’): Находит все кэши, помеченные этим тегом, и делает их невалидными.
Вывод:
Тегированный кэш — это вершина управления кэшем в Битрикс.
Он позволяет создавать сложные, зависимые друг от друга кэши и поддерживать их в актуальном состоянии автоматически.
Для всех компонентов, которые выводят данные из нескольких разных источников (например, каталог + бренды + отзывы), использование тегированного кэширования является обязательным для достижения максимальной производительности.
Managed Cache, Tagged Cache, Битрикс, тегированный кеш, registerTag, clearByTag, CPHPCache, Bitrix\Main\Data\Cache, оптимизация.