Блог Горошко Андрея 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, оптимизация.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

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

Related Post

Получить список типов цен по фильтру catalog.priceType.listПолучить список типов цен по фильтру catalog.priceType.list

Каждый PHP-разработчик, работающий с экосистемой Bitrix Framework, должен глубоко понимать работу её ключевых компонентов. В этой статье мы проведем подробный аудит темы «Получить список типов цен по фильтру catalog.priceType.list», проанализируем

Разработка сайта отеля, гостиницы и базы отдыха на 1С-БитриксРазработка сайта отеля, гостиницы и базы отдыха на 1С-Битрикс

Создание и развитие эффективного веб-ресурса по направлению «Разработка сайта отеля, гостиницы и базы отдыха на 1С-Битрикс» позволяет усилить позиции бренда на рынке, автоматизировать взаимодействие с заказчиками и кратно увеличить поток

Разработка интернет-магазина охоты, рыбалки и туризма на 1С-БитриксРазработка интернет-магазина охоты, рыбалки и туризма на 1С-Битрикс

Создание современного интернет-магазина охоты, рыбалки и туризма на платформе 1С-Битрикс позволяет автоматизировать продажи, обеспечить высокую конверсию и бесшовную интеграцию с учетными системами. Для ниши «охоты, рыбалки и туризма» критически важны