Дата последнего изменения: 26.09.2024
Главный модуль поддерживает теги кеша Тегируется не выборка, а файл кеша. . Кеш можно помечать тегами и сбрасывать по ним. Сброс кеша компонентов инфоблоков происходит при изменении в них информации.
Базовый код тегирования кеша:
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"]);
.
Если выборка не содержит элементов, то значение идентификатора инфоблока будет взято из фильтра.
Если выборка НЕ пустая, в arSelect не запрашивается IBLOCK_ID, но есть фильтрация по IBLOCK_ID, то сброс кеша произойдёт.
Сброс кеша вызывается из методов Add/Update/Delete для элементов, разделов и инфоблоков.
Не стоит использовать этот механизм при частом обновлении элементов или разделов. С другой стороны это должно быть удобным для редакторов сайтов: изменения моментально отображаются на сайте. Еще один плюс — можно задавать практически бесконечное время кеширования.