Хотелось бы разобраться с тегированным кешированием, услышать мнение людей, кто пользуется им в повседневной жизни. Расписал своё понимание этой темы.
Скрытый текст |
---|
[CODE] 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); } } } [/CODE] |
По дефолту есть только тег 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/