Создание закэшированных данных, которые будут сбрасываться при изменении данных в двух инфоблоках (id инфоблоков 6 и 2).
Если при получении данных используются методы Fetch/GetNext, и или в них, или в GetList (в arSelect или в arFilter) находится IBLOCK_ID, то регистрировать тег для данного инфоблока не нужно. В методах Fetch/GetNext уже есть регистрация тега по id инфоблока. Если же IBLOCK_ID не содержится в arSelect или в arFilter, или выборка пустая, то необходимо указать тег самостоятельно.
ПРИМЕЧАНИЕ: Если тегированный кэш используется внутри компонента у которого включен управляемый кэш (например в result_modifier.php), то при изменении элементов, будет сбрасываться кэш и всего компонента, даже если элементы инфоблока этого компонента не менялись, а менялись только элементы выборка которых идет в result_modifier.php. Потому что тегированный кэш работает вложенно, как матрешки. Поэтому при использовании одного компонента внутри другого, обновляются оба, если у них включен управляемый кэш.
require_once($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/include/prolog_before.php');
$cache_id = 'test123';
$cache_dir = "/tagged_test123";
$iblockId = 6;
$tagName = 'iblock_id_6';
$tagName2 = 'iblock_id_2';
$obCache = new CPHPCache;
if ($obCache->InitCache(36000, $cache_id, $cache_dir)) {
$arElements = $obCache->GetVars();
$arElements['123'] = 'есть кэш';
}
elseif (CModule::IncludeModule("iblock") && $obCache->StartDataCache()) {
$arElements = array();
$arSelect = Array("ID", "NAME");
$arFilter = Array("IBLOCK_ID" => $iblockId, "ACTIVE" => "Y");
$res = CIBlockElement::GetList(Array(), $arFilter, false, Array(), $arSelect);
$GLOBALS["CACHE_MANAGER"]->StartTagCache($cache_dir);
while($arElement = $res->Fetch())
{
$arElements[] = $arElement;
}
$arElements['123'] = 'нет кеша';
$GLOBALS["CACHE_MANAGER"]->RegisterTag($tagName);
$GLOBALS["CACHE_MANAGER"]->RegisterTag($tagName2);
$GLOBALS["CACHE_MANAGER"]->EndTagCache();
$obCache->EndDataCache($arElements);
}
else {
$arElements = array();
}
d($arElements);
Поиск папки с кэшем для стандартного компонента, чтобы пометить ее своим тегом, и удалять при необходимости:
В шаблон компонента (в result_modifier.php) добавьте следующий код:
if (defined('BX_COMP_MANAGED_CACHE') && is_object($GLOBALS['CACHE_MANAGER'])) {
$cp =& $this->__component;
if (strlen($cp->getCachePath())) {
$GLOBALS['CACHE_MANAGER']->RegisterTag('my_custom_tag');
}
}
//чтобы сбросить кэш:
if (defined('BX_COMP_MANAGED_CACHE') && is_object($GLOBALS['CACHE_MANAGER']))
$GLOBALS['CACHE_MANAGER']->ClearByTag('my_custom_tag');
Сбросить кэш для инфоблока 1
use \Bitrix\Main\Application;
$taggedCache = Application::getInstance()->getTaggedCache(); // Служба пометки кэша тегами
$taggedCache->clearByTag('iblock_id_1');