Хотелось бы разобраться с тегированным кешированием, услышать мнение людей, кто пользуется им в повседневной жизни. Расписал своё понимание этой темы.
Скрытый текст |
---|
Код |
---|
class TestCache extends \CBitrixComponent {
public $arResult;
private $cache_id;
private $cache_dir;
private $obCache;
public function executeComponent(){
$this->cache_id = md5(serialize($this->arParams).$this->getName());
$this->cache_dir = "/test_cache/";
$this->obCache = new CPHPCache;
if($this->obCache->InitCache(36000, $this->cache_id, $this->cache_dir))
{
$this->arResult = $this->obCache->GetVars();
}
elseif(Loader::includeModule('iblock') && $this->obCache->StartDataCache())
{
$res = ElementTable::GetList(
array(
"filter" => array(
"IBLOCK_ID" => $this->arParams['IBLOCK_ID'],
),
"select" => array(
"IBLOCK_ID",
"ID",
"NAME",
),
)
);
global $CACHE_MANAGER;
$CACHE_MANAGER->StartTagCache($this->cache_dir);
while($arItem = $res->Fetch()){
$CACHE_MANAGER->RegisterTag("iblock_id_".$arItem["IBLOCK_ID"]);
$this->arResult[] = $arItem;
}
$CACHE_MANAGER->EndTagCache();
$this->obCache->EndDataCache($this->arResult);
}
}
}
|
|
По дефолту есть только тег iblock_id_XX, который сбрасывает кеш при добавлении/изменении/удалении элементов этого инфоблока. Причем удаляется весь кеш из папки $cache_dir.
Например, если один компонент используется для вывода новостей (IBLOCK_ID = 1) и акций (IBLOCK_ID = 2), $cache_dir указана как test_cache, то при создании кеша создается папка и файл - /bitrix/cache/test_cache/(первые 2 символа $cache_id)/$cache_id.phpДалее, если изменить любой элемент 1 или 2 инфоблока, то удалиться вся папка /bitrix/cache/test_cache/ .
Из этой ситуации есть минимум 2 выхода:
1) Указывать $cache_dir = "/", тогда папки из $cache_id будут создаваться в /bitrix/cache/ и при C/U/D элементов будут удаляться только эти папки;
2) Генерировать $cache_dir по шаблону, например "iblock_id_".$this->arParams['IBLOCK_ID']
Принципиального отличия между этими вариантами нет, кроме как создания дополнительного уровня папок у второго варианта. Но это может помочь, при дублировании первых символов $cache_id, ведь в этом случае в папку попадут несколько файлов из разных (а могут и из одного) инфоблоков, и при изменениях в одном из них, будет удаляться кеш другого. А создав каждому инфоблоку свою $cache_dir мы исключим удаление лишнего кеша.
Что касается не дефолтных тегов, то создание тегов вида "element_id_".$elementID врядли чем то сможет помочь, так как все эти теги будут смотреть на одну дирректорию внутри /bitrix/cache/iblock_id_(IBLOCK_ID), и при изменении элемента, все равно будет удаляться кеш всего инфоблока.
Но все же, если очень хочется при изменении элемента удалять только его кеш, то можно для каждого элемента создавать отельную $cache_dir. Но в этом случае создасться огромное количество дирректорий в /bitrix/cache/