public static function getIBlocksCodeIDMap()
{
if (!\Bitrix\Main\Loader::includeModule('iblock'))
return;
$arIBlocksIDsByCode = array();
$cache = new CPHPCache();
$cache_time = 86400;
$cache_id = 'getIBlocksCodeIDMap' . SITE_ID;
$cache_path = '/getIBlocksCodeIDMap/';
if ($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, $cache_path))
{
$res = $cache->GetVars();
if (is_array($res["IBlocksCodeIDMap"]) && (count($res["IBlocksCodeIDMap"]) > 0))
$arIBlocksCodeIDMap = $res["IBlocksCodeIDMap"];
}
if (empty($arIBlocksCodeIDMap))
{
$rsIBlocks = \CIBlock::GetList(
Array(),
Array(
"SITE_ID" => SITE_ID
)
);
global $CACHE_MANAGER;
$CACHE_MANAGER->StartTagCache($cache_path);
while ($arIBlock = $rsIBlocks->Fetch()) {
$CACHE_MANAGER->RegisterTag("iblock_id_".$arIBlock["ID"]);
$arIBlocksCodeIDMap[$arIBlock['CODE']] = $arIBlock['ID'];
}
$CACHE_MANAGER->RegisterTag("getIBlocksCodeIDMap");
$CACHE_MANAGER->RegisterTag("iblock_id_new");
$CACHE_MANAGER->RegisterTag("getIBlocksCodeIDMap");
$CACHE_MANAGER->EndTagCache();
if ($cache_time > 0) {
$cache->StartDataCache($cache_time, $cache_id, $cache_path);
$cache->EndDataCache(array("IBlocksCodeIDMap" => $arIBlocksCodeIDMap));
}
}
return $arIBlocksCodeIDMap;
}
данный метод выдаёт массив типа "Символьный код инфоблока" => "id инфоблока". В идентификатор массива $cache_id ложатся параметры, от которых зависит результат работы кода, находящийся внутри if (empty($arIBlocksCodeIDMap)) { } . В данном примере параметр только один - SITE_ID . Но в зависимости от решаемой задачи, их может быть несколько. При изменении хотя бы одного параметра, создаётся новый вариант кэша. Папка с кэшем после выполнения метода: http://prntscr.com/j2ghns
Для демонстрации я добавлю идентификатору кэша новый параметр, значения которого будут несколько раз меняться:
я несколько раз выполнил метод и папка с кэшем изменила своё содержимое: http://prntscr.com/j2giqd Каждому идентификатору $cache_id в папке $cache_path соответствует подпапка (08, 11, 6f, 9с и т.д.). Через $CACHE_MANAGER->RegisterTag папке $cache_path назначаются тэги. При сбросе хотя бы по одному из назначенных тэгов (ClearByTag) содержимое папки $cache_path полностью очистится. getIBlocksCodeIDMap - это созданный тэг, который будет назначен только папке с кэшем для этого метода. iblock_id_ - это штатный тэг. Так выглядит сброс кэша по штатному тегу:
iblock_id_new - тэг, по которому делается сброс при добавлении элемента Сброс по iblock_id_new делается в методах: CAllIBlock::Add CSocNetLogTools::SetUFRights
Зачастую используется метод clearIblockTagCache($iblock_id) , в котором, в свою очередь вызывается $CACHE_MANAGER->ClearByTag('iblock_id_'.$iblock_id); CIBlock::clearIblockTagCache вызывается в : CAllPrice::ReCalculate CAllCatalogProduct::QuantityTracer CCatalogProductProvider::clearPublicCache CCatalogDocsTypes::clearPublicCache CatalogProvider::clearPublicCache CIBlockRights::SetRights CAllIBlockElement::Add CAllIBlockElement::Delete CAllIBlockSection::Add CAllIBlockSection::Update CAllIBlockSection::Delete CIBlockElement::Update
CAllIBlock имеет собственный clearIblockTagCache и вызывается он в методах: Update Delete
$DB->StartTransaction();
CIBlockElement::SetPropertyValuesEx($ELEMENT_ID, $arParams["IBLOCK_ID"], array( //сброс кэша по "iblock_id_" . $arParams["IBLOCK_ID"] сам не делает
Мы можем сделать сброс по тэгу getIBlocksData $CACHE_MANAGER->ClearByTag("getIBlocksData"); и у нас очистится папка getIBlocksData , т.е. сбросится кэш, с которым работает второй метод. Все три метода работают с одним и тем же набором инфоблоков, и если в системе, например, есть инфоблок с id = 4, то на все три папки - /getIBlocksCodeIDMap/ , /getIBlocksData/ , /getIBlocksIDNameMap/ - будет назначен тэг "iblock_id_4". И при редактировании инфоблока с id = 4 через админку вызовется метод CIBlock::Update() , который вызовет clearIblockTagCache(4), который вызовет ClearByTag для "iblock_id_4" и все три папки очистятся (точнее не совсем очистятся - произведётся отложенное удаление папок - но об этом я напишу позже, сейчас - в данном контексте - это не важно), т.е. для всех трёх методов произведётся сброс кэша.
В блогах иногда можно встретить такое понятие, как "Кэш инфоблока". На самом деле у инфобока кэша, как такового, не существует, есть просто штатный тэг iblock_id_ , который вызывают штатные функции Add, Update, Delete. Кстати iblock_id_ - это не единственный штатный тэг, полный список штатных тэгов и методов, которые делают по ним сброс, я предоставлю в следующей публикации.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».