Добро пожаловать на сайт <БагБД>, где вы можете задавать вопросы о программировании и разработке на Битрикс и Битрикс24, и получать быстрые и квалифицированные ответы от профессионалов!

Очистка кэша в компоненте.

00 голосов
3
Цель: При добавлении нового элемента(в начале компонента) чтоб очищался кэш данного компонента.
Решение пока такое: зависимости от параметра компонента(в данном случае CLEAR_CACHE) очищаем кэш.
Вот дебаг код:
Код
$arParams["CLEAR_CACHE"] = $arParams["CLEAR_CACHE"]=="Y";
$CLEAR_CACHE = $arParams["CLEAR_CACHE"];
unset($arParams["CLEAR_CACHE"]);...
$CACHE_ID = array($arrFilter, $USER->GetGroups(), $arNavigation);
if ($CLEAR_CACHE) $this->ClearResultCache($CACHE_ID)

if( $this->StartResultCache(false, $CACHE_ID) ){...

Самое главное: Почему не работает?))

и еще что лучще:
Код
if( $this->StartResultCache(false, $CACHE_ID) )
или всё таки выдавать не кэш -
if( ($CLEAR_CACHE?true:$this->StartResultCache(false, $CACHE_ID)) ){...
спросил 20 Фев, 14 от Dryad (100 баллов)

3 Ответы

00 голосов
Присоединяюсь! Использую в точности как указал Карен Кратян, т.е. если установлена переменная, вызываю ClearResultCache до вызова StartResultCache, но ничего не происходит! Кэш не обновляется!
Код
...
  if(isset($_REQUEST["u"])){
    $this->ClearResultCache($USER->GetGroups());
  }
  if($this->StartResultCache(false, $USER->GetGroups())){
    ...
  }
...

Не работает! Как обновить кэш?
ответил 18 Июль, 14 от Yoghurt (200 баллов)
00 голосов
Нашёл решение, вроде работает.
Код
$CACHE_ID = serialize(array($arrFilter, $arNavigation));// задаём кэш в виде строки
if ($CLEAR_CACHE) // если очистить
{
   $this->ClearResultCache($CACHE_ID);

}
if($this->StartResultCache(false, $CACHE_ID)) || $CLEAR_CACHE){


И хочу обратить внимание на файл /bitrix/modules/main/classes/general/component.php.
В функции StartResultCache используется $this->__cacheID = $this->GetCacheID($additionalCacheID);
А в функции ClearResultCache не используется функция GetCacheID, а $this->__cacheID вычесляется также, как и в функции GetCacheID, вместо $this->__cacheID = $this->GetCacheID($additionalCacheID);
Не проверял одинаковы ли полученный кэш, но глупо вводить функцию GetCacheID и не пользоваться ею)
ответил 18 Ноя, 14 от Dryad (100 баллов)
00 голосов
На самом деле нашел я, где там ошибочка...
Больше всего напорчено вот в этом файле \bitrix\modules\main\classes\general\cache.php в функции Clean:
Код
   function Clean($uniq_str, $initdir = false, $basedir = "cache")
   {
      $basedir = BX_PERSONAL_ROOT."/".$basedir."/";
      $filename = CPHPCache::GetPath($uniq_str);
      if(is_object($this->_cache)){
         return $this->_cache->clean($basedir, $initdir, "/".$filename);
      }else
      {
         $obCache = new CPHPCache();
         $obCache->Clean($uniq_str, $initdir, $basedir);
      }
   }

Если посмотреть, как оно вызывается в файле \bitrix\modules\main\classes\general\component.php в функции ClearResultCache:
Код
   function ClearResultCache($additionalCacheID = False, $cachePath = False)
   {
      
      ... пропущено ...
      
      CPHPCache::Clean($this->__cacheID, $this->__cachePath);
   }
становится ясно, что функция Clean вызовет сама себя второй раз (рекурсивно), соответственно будет испорчена переменная $basedir. Вместо обычного /bitrix/cache/ в нее запишется что-то такое, например: /bitrix//bitrix/cache//. В результате путь к файлу кеша будет испорчен, а значит функция его попросту не удалит (не найдет) :)

Решение:
1) Если не мучит совесть вносить правки в файлы Битрикса, то самое очевидное и безопасное на мой взгляд, это поменять вызов функции Clean в файле \bitrix\modules\main\classes\general\component.php в функции ClearResultCache вот на такой:
Код
   function ClearResultCache($additionalCacheID = False, $cachePath = False)
   {
      
      ... пропущено ...
      
      $obCache = new CPHPCache;
      $obCache->Clean($this->__cacheID, $this->__cachePath);
   }
после этого все прекрасно работает как и должно по документации!
Очень надеюсь, что BX это исправят (или уже исправили) ;)

2) Использовать что-то вроде решения, предложенного Кареном. Карен Кратян, вы в общем тоже все верно предложили, ваше решение попросту обходит эту дырку вокруг :) Как и в других местах предлагали самим указывать пути и удалять их. Просто почему-то никто не захотел копнуть поглубже и понять, что же там такое неверно работает :)

*) Как вариант, можно так же изменить функцию Clean в этом файле \bitrix\modules\main\classes\general\cache.php вот на такую:
Код
   function Clean($uniq_str, $initdir = false, $basedir = "cache")
   {
      if(is_object($this->_cache)){
        $basedir = BX_PERSONAL_ROOT."/".$basedir."/";
        $filename = CPHPCache::GetPath($uniq_str);
         return $this->_cache->clean($basedir, $initdir, "/".$filename);
      }
      else
      {
         $obCache = new CPHPCache();
         return $obCache->Clean($uniq_str, $initdir, $basedir);
      }
   }
должно работать :)
ответил 14 Март, 15 от Yoghurt (200 баллов)

Похожие вопросы

0 голосов
1 ответ
спросил 17 Фев, 14 от sanokruss (160 баллов)
0 голосов
1 ответ
0 голосов
0 ответов
спросил 17 Сен, 15 от аноним
+1 голос
1 ответ