Собственно есть некоторая проблема в отсутствии документации и примеров внятных. Хочу я, например, закэшировать какую-то выборку из БД в классе компонента. Пишу:
Ну тут вроде всё просто. Кэш пишется в файл, в директорию $cachePath. Для каждого такого компонента на странице, для каждой страницы генерируется свой $cacheId. Без этого никак, страниц много, компонентов на страницах чаще всего больше одного.
Проблема в том, что кэш то пишется, вот только не берётся он оттуда. Каждый раз создаются запросы к БД и файлик перезаписывается. Если отследить все переменные, то всё в порядке. Всё куда надо записывается, всё принимает правильные значения (как мне кажется, правильные), но initCache упорно возвращает false.
Пробуем управляемое кэширование:
Та же самая история. Файлики создаются, кэш полнится, но не видит себя, хоть тресни.
И как же разрешилась эта история? Кэш заработал чуть ли не сам по себе ("я ничего не трогал, оно само сломалось", да). Но у меня стойкое чувство, что дело было в $cacheId, который, кстати, формируется вот так:
После долгих и мучительных часов в компании с кэшем, я просто решил попробовать сделать $cacheId какой-нибудь заданной строкой, вроде "cache_id". Всё работало. Я подумал, окей, давай-ка добавим префикс к хэшу, может ему не нравится, когда id начинается с цифры. Добавил - перестало работать. Убрал из массива $cacheIdArray всё, кроме последних двух элементов - снова заработало. Добавлял по одному обратно и оно так и продолжило работать.
Магия тут в том, что если опять убрать, а потом снова добавить префикс к $cacheId, всё снова перестаёт работать и приходится опять убирать элементы массива и снова добавлять. Примеры получаются рабочие, но дышать на них нельзя, что меня не очень устраивает. Может кто знает, в чём тут дело?
Код |
---|
use Bitrix\Main\Data\Cache; $cache = Cache::createInstance(); $cacheId = $this->generateCacheId(); //тут у меня функция небольшая, вспомогательная $cachePath = $this->generateCachePath(); //тут тоже кастомная небольшая функция $result = array(); if ($cache->initCache($this->arParams["CACHE_TIME"], $cacheId, $cachePath)) { $res = $cache->getVars(); $result = $res["ITEMS"]; } elseif($cache->startDataCache()) { $res = array(); try { //Тут выборочка $cache->endDataCache(array("ITEMS" => $result)); } catch(SystemException $e) { $cache->abortDataCache(); ShowError($e->getMessage()); } } |
Ну тут вроде всё просто. Кэш пишется в файл, в директорию $cachePath. Для каждого такого компонента на странице, для каждой страницы генерируется свой $cacheId. Без этого никак, страниц много, компонентов на страницах чаще всего больше одного.
Проблема в том, что кэш то пишется, вот только не берётся он оттуда. Каждый раз создаются запросы к БД и файлик перезаписывается. Если отследить все переменные, то всё в порядке. Всё куда надо записывается, всё принимает правильные значения (как мне кажется, правильные), но initCache упорно возвращает false.
Пробуем управляемое кэширование:
Код |
---|
use Bitrix\Main\Application; $cache = Application::getInstance()->getManagedCache(); $cacheId = $this->generateCacheId(); $result = array(); if ($cache->read($this->arParams["CACHE_TIME"], $cacheId)) { $res = $cache->get($cacheId); $result = $res["ITEMS"]; } else { $res = array(); try { //Тут выборочка $cache->set($cacheId, array("ITEMS" => $result)); } catch(SystemException $e) { $cache->abortDataCache(); ShowError($e->getMessage()); } } |
Та же самая история. Файлики создаются, кэш полнится, но не видит себя, хоть тресни.
И как же разрешилась эта история? Кэш заработал чуть ли не сам по себе ("я ничего не трогал, оно само сломалось", да). Но у меня стойкое чувство, что дело было в $cacheId, который, кстати, формируется вот так:
Код |
---|
protected function generateCacheId() { global $APPLICATION; $page = str_replace('/', '', $APPLICATION->GetCurPage()); $cacheIdArray = array( __CLASS__, $this->getLanguageId(), $this->getSiteId(), $page, $this->arParams["CACHE_FOLDER"] //Это костыль для нескольких одинаковых компонентов на странице. Каждому своё уникальное значение и всё. ); $id = 'mpm_'.md5(implode("", $cacheIdArray)); return $id; } |
После долгих и мучительных часов в компании с кэшем, я просто решил попробовать сделать $cacheId какой-нибудь заданной строкой, вроде "cache_id". Всё работало. Я подумал, окей, давай-ка добавим префикс к хэшу, может ему не нравится, когда id начинается с цифры. Добавил - перестало работать. Убрал из массива $cacheIdArray всё, кроме последних двух элементов - снова заработало. Добавлял по одному обратно и оно так и продолжило работать.
Магия тут в том, что если опять убрать, а потом снова добавить префикс к $cacheId, всё снова перестаёт работать и приходится опять убирать элементы массива и снова добавлять. Примеры получаются рабочие, но дышать на них нельзя, что меня не очень устраивает. Может кто знает, в чём тут дело?