167  /  330

Сache Dependencies (тегированный кеш)

Просмотров: 4851 (Статистика ведётся с 06.02.2017)

С версии главного модуля 9.1.0 появилась поддержка тегов кеша. Кеш можно помечать тегами и сбрасывать по тегам же. Сброс кеша компонентов инфоблоков происходит при изменении информации в них.

Внимание! Для часто обновляемого большого массива данных использование тегированного кеша неоправданно.

Базовый код тегирования кеша:

01: $cache_id = md5(serialize($arParams));
02: $cache_dir = "/tagged_getlist";
03:
04: $obCache = new CPHPCache;
05: if($obCache->InitCache(36000, $cache_id, $cache_dir))
06: {
07:     $arElements = $obCache->GetVars();
08: }
09: elseif(CModule::IncludeModule("iblock") && $obCache->StartDataCache())
10: {
11:     $arElements = array();
12:     $rsElements = CIBlockElement::GetList($arParams["order"], $arParams["filter"]);
13:
14:     global $CACHE_MANAGER;
15:     $CACHE_MANAGER->StartTagCache($cache_dir);
16:     while($arElement = $rsElements->Fetch())
17:     {
18:         $CACHE_MANAGER->RegisterTag("iblock_id_".$arElement["IBLOCK_ID"]);
19:         $arElements[] = $arElement;
20:     }
21:     $CACHE_MANAGER->RegisterTag("iblock_id_new");
22:     $CACHE_MANAGER->EndTagCache();
23:
24:     $obCache->EndDataCache($arElements);
25: }
26: else
27: {
28:     $arElements = array();
29: }

В строке 01 инициализируется уникальный идентификатор файла кеша. Далее определяется каталог относительно /bitrix/cache, в котором будут сохранятся файлы кеша с разными значениями $arParams. Важно, что этот путь начинается со слеша и им не заканчивается. При использовании в качестве кеша memcached или APC это будет критичным при сбросе кеша.

В строках 04-05 инициализируется объект кеша. Если время кеширования не истекло, то будет выполнена строка 07 и мы получим данные из файла кеша.

Условие в строке 09 фактически всегда будет true. Это подключение модуля и начало кеширования.

В строке 12 происходит обращение к базе данных. Важно, чтобы все параметры от которых зависит результат выборки "поучаствовали" в идентификаторе кеша ($cache_id).

В 14-й строчке объявляется доступ к переменной $CACHE_MANAGER. Этот объект будет управлять тегами.

Строка 15 - все последующие назначаемые теги будут привязаны к каталогу $cache_dir. При сбросе кеша по одному из них содержимое этого каталога будет удалено. StartTagCache - может использоваться рекурсивно. Например:

$CACHE_MANAGER->StartTagCache($cache_dir1);
    $CACHE_MANAGER->StartTagCache($cache_dir2);
        $CACHE_MANAGER->StartTagCache($cache_dir3);
        $CACHE_MANAGER->EndTagCache();
    $CACHE_MANAGER->EndTagCache();
$CACHE_MANAGER->EndTagCache();

Важно чтобы вызовы StartTagCache и EndTagCache были сбалансированы. Объект $CACHE_MANAGER создает и отслеживает стек каталогов кеша. При этом теги назначенные на каталог $cache_dir3 будут также связаны и с $cache_dir2 и $cache_dir1. Теги назначенные на cache_dir2 будут связаны и с $cache_dir1.

В строке 18 происходит отметка кеша тегом с помощью метода RegisterTag. Длина тела может быть до 100 символов. В методе RegisterTag автоматически удаляются дубликаты тегов.

Строка 21 - необходима для сброса кеша при добавлении нового инфоблока, ведь у него на момент создания кеша тег не записывается (инфоблока ещё нет).

Строка 22 - запись тегов каталога в таблицу базы данных. Можно считать по одному insert'у на тег.

Сброс кеша:

$CACHE_MANAGER->ClearByTag("iblock_id_7");
или (с 15.0.7):
CIBlock::clearIblockTagCache( 7 );

Для отключения тегирования конкретных инфоблоков используйте:

CIBlock::DisableTagCache($iblock_id)

Компоненты инфоблоков

Для запуска механизма необходимо определить константу в файле dbconn.php. (Это можно сделать простым включением Управляемого кеша на закладке Управляемый кеш на странице Настройки > Настройки продукта > Автокеширование.)

define("BX_COMP_MANAGED_CACHE", true);

При этом в методе StartResultCache компонента будет вызываться StartTagCache с путем к кешу компонента (с учетом страницы). А в методе EndResultCache (который в свою очередь вызывается из IncludeComponentTemplate) - EndTagCache.

В модуле инфоблоков CIBlockElement::GetList и CIBlockSection::GetList возвращают объект класса CIBlockResult.

В методе Fetch/GetNext этого объекта будут вызываться $CACHE_MANAGER->RegisterTag("iblock_id_".$res["IBLOCK_ID"]);. Если выборка не содержит элементов, то значение идентификатора инфоблока будет взято из фильтра.

Сброс кеша вызывается из методов Add/Update/Delete для элементов, разделов и инфоблоков.

Не стоит использовать этот механизм при частом обновлении элементов или разделов. С другой стороны это должно быть удобным для редакторов сайтов: изменения моментально отображаются на сайте. Еще один плюс - можно задавать практически бесконечное время кеширования.

Советы от веб-разработчиков.

Антон Долганин: Не забывайте, что управляемый кеш инфоблоков очищается только при вызове Update. При изменении, например, свойств с помощью SetPropertyValueCode очистки не произойдет. Делаем вручную после изменения:
if(defined('BX_COMP_MANAGED_CACHE'))
   $GLOBALS['CACHE_MANAGER']->ClearByTag('iblock_id_'.$arParams['IBLOCK_ID']);

28
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии