Блог Горошко Андрея 1C-Битрикс Продвинутое кэширование в Битрикс: Managed Cache и Tagged Cache

Продвинутое кэширование в Битрикс: Managed Cache и Tagged Cache

Средний рейтинг
Еще нет оценок

Обычное кэширование по времени (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, оптимизация.

Мой рейтинг:

Добавить комментарий

Related Post

Обработка форм и POST-запросов в Битрикс: От HTML до component.phpОбработка форм и POST-запросов в Битрикс: От HTML до component.php

Средний рейтинг Еще нет оценок Любой интерактивный сайт нуждается в формах: обратная связь, заказ, подписка. В Битрикс вы можете легко создать свою собственную логику обработки форм внутри компонента. Это дает

Работа с пользователями в Битрикс: CUser::GetList, Add, UpdateРабота с пользователями в Битрикс: CUser::GetList, Add, Update

Средний рейтинг Еще нет оценок Управление пользователями — одна из ключевых задач любой CMS. В Битрикс для этого предназначен класс CUser. Глобальный объект $USER (экземпляр этого класса) доступен на каждой странице и содержит

Как создать свой метод REST API в Битрикс на D7 контроллерахКак создать свой метод REST API в Битрикс на D7 контроллерах

Средний рейтинг Еще нет оценок  Стандартный REST API Битрикс24 можно и нужно расширять своими методами. Это позволяет выносить кастомную бизнес-логику в API и взаимодействовать с ней из внешних систем, мобильных