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

Вопрос с кешированием

00 голосов
8
Доброго времени суток !
В компоненте "древовидные комментарии" появилась задача реализовать кеширование.

Вопрос в том, как сделать так, чтобы при добавлении нового коммента к определенному объекту, чистился кеш только для этого объекта, а комментарии для других объектов по-прежнему подгружались бы из кеша.

Кто-нибудь сталкивался с подобной задачей ?
спросил 01 Июль, 13 от Miedz (220 баллов)

8 Ответы

00 голосов
Если я правильно понял задачу, то при использовании штатных битриксовых компонентов она не решается.
ответил 01 Июль, 13 от Ly (4,580 баллов)
00 голосов
Цитата
Dmitry Ban пишет:
Если я правильно понял задачу, то при использовании штатных битриксовых компонентов она не решается.
Имеется в виду самописный компонент. Он принимает параметр (ID элемента инфоблока) и выводит комментарии для этого элемента. Хотелось бы, чтобы в зависимости от этого параметра, сохранялся бы разный кеш.
ответил 05 Авг, 13 от AtomiX (140 баллов)
00 голосов
Пример такого компонента. Кеш зависит только от ID элемента ($arParams['ELEMENT_ID'])

Код
.....
if ($arParams['CACHE_TYPE'] === 'Y' || ($arParams['CACHE_TYPE'] === 'A' && COption::GetOptionString('main', 'component_cache_on', 'Y') === 'Y'))
   $arParams['CACHE_TIME'] = intval($arParams['CACHE_TIME']);
else
   $arParams['CACHE_TIME'] = 0;
.....


$cache_id = serialize(array($arParams['ELEMENT_ID']));
$cache_path = SITE_ID.'/'.str_replace(':', '/', $this->GetName());
$obCache = new CPHPCache;
if ($obCache->InitCache($arParams['CACHE_TIME'], $cache_id, $cache_path))
{
   $vars = $obCache->GetVars();
   foreach ($vars as $key => $value)
      $arResult[$key] = $value;
   $obCache->Output();
}
elseif ($obCache->StartDataCache())
{

   ..... do something

   $obj = CIBlockElement::GetList(false, $arFilter)->GetNextElement();
   if ($obj)
   {
         
      ..... do something

      $this->IncludeComponentTemplate();
      $obCache->EndDataCache(array(
         'ITEM' => $arResult['ITEM'],
         'TEMPLATE_FOLDER' => $arResult['TEMPLATE_FOLDER'],
      ));
   }
   else
   {
      @define("ERROR_404", "Y");
      CHTTP::SetStatus("404 Not Found");
      $obCache->AbortDataCache();
   }
}

 
ответил 06 Ноя, 13 от Ly (4,580 баллов)
00 голосов
А для очистки вызывайте CPHPCache::Clean() со следующими параметрами:
uniq_str -- как $cache_id в вызове $obCache->InitCache
initdir -- как $cache_path там же
ответил 12 Фев, 14 от Ly (4,580 баллов)
00 голосов
Спасибо большое, попробуем
ответил 02 Июнь, 14 от AtomiX (140 баллов)
00 голосов
Не могли бы вы подсказать, в чем ошибка.

Код
$cache_id = serialize(array($arParams['OBJECT_ID']));
$cache_path = SITE_ID.'/'.str_replace(':', '/', $this->GetName());
...
*Очистка кэша происходит сразу после добавления записи 

Код
CPHPCache::Clean($cache_id, $cache_path);
...
Код
$obCache = new CPHPCache; 
if ($obCache->InitCache($arParams['CACHE_TIME'], $cache_id, $cache_path))
{
   $vars = $obCache->GetVars();
   foreach ($vars as $key => $value)
   $arResult[$key] = $value; 
   $obCache->Output();
}
elseif ($obCache->StartDataCache())
{
   getComments(); // рекурсивная функция, заполняющая массив

   $arResult['COMMENTS'] = $comments; // получение массива записей

   $this->IncludeComponentTemplate();

   $obCache->EndDataCache(array("arResult" => $arResult));

   @define("ERROR_404", "Y");
   CHTTP::SetStatus("404 Not Found");
   $obCache->AbortDataCache(); 
}


В итоге действительно для разных элементов создается разный кеш, но в Отладке запросов видно, что выполняются лишние запросы (причем вероятность случайная). Я так понимаю, что при включенном кешировании запросов вообще быть не должно.

prefix:moduleID: 0.005 с; кеш: 24 КБ
prefix:moduleID: 0.0198 с; Запросов: 58 (0.0037 с); кеш: 25 КБ
prefix:moduleID: 0.0049 с; кеш: 24 КБ
prefix:moduleID: 0.0087 с; кеш: 24 КБ
prefix:moduleID: 0.0196 с; Запросов: 58 (0.0036 с); кеш: 25 КБ
prefix:moduleID: 0.0048 с; кеш: 24 КБ
prefix:moduleID: 0.0048 с; кеш: 24 КБ
prefix:moduleID: 0.0049 с; кеш: 24 КБ

А так же интересно, как сделать так, чтобы выбранная группа(или группы) пользователей имели свой кеш.
ответил 30 Сен, 14 от Miedz (220 баллов)
00 голосов
Вот этот блок кода уберите. У меня он вызывался только в том случае, если искомый элемент не найден. А у вас он срабатывает каждый раз и сбрасывает кеш.

Код
   @define("ERROR_404", "Y");
   CHTTP::SetStatus("404 Not Found");
   $obCache->AbortDataCache(); 
 
ответил 02 Фев, 15 от Ly (4,580 баллов)
00 голосов
Убрал, но все равно это проблему не решило :(
ответил 16 Май, 15 от Miedz (220 баллов)

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

0 голосов
1 ответ
спросил 15 Дек, 15 от аноним
0 голосов
4 ответов
спросил 12 Янв, 14 от OpakyJl (100 баллов)
0 голосов
5 ответов
спросил 23 Май, 13 от Kartez (260 баллов)
0 голосов
0 ответов
спросил 15 Окт, 13 от аноним
0 голосов
2 ответов
спросил 06 Май, 14 от MortiMer (160 баллов)