Усовершенствовать механизм тегированного кеша. Есть случаи, когда в инфоблоках его сбрасывать не надо

Рейтинг: 1.5689  
Внедрено
Предложил Зайцев Артемий 15.11.2014 20:23:24

Усовершенствовать механизм тегированного кеша. Есть случаи, когда в инфоблоках его сбрасывать не надо

Пока идет обмен с 1С, где-то плачет один заказчик.

Когда Битрикс сделал тегированный кеш - была допущена огромная недоработка. Многие серьезные сайты стали работать существенно медленнее.

------------

С одной стороны здорово, что описания и цены на сайте сразу обновляются при изменении элемента.

Но если идет обмен с 1С, то сайт фактически лежит. Потому что кеш всех компонентов инфоблока сбрасывается обменом, и ходить по сайту невозможно.

Представьте, сколько времени надо для записи 10000 легковых шин в инфоблок?

Умные фильтры особенно усугубляют производительность. Тегированный кеш приходится полностью отключать.

-------------

Идея 1.

Добавьте возможность в компоненте указать, что в нем тегированный кеш не используется.

Фильтр, который показывает все возможные варианты особенно тормозит, пока идет обмен с 1С.

Я бы в нем отключил тегированный кеш и использовал обычный кеш. Никто не заметит, что шаблон фильтра только раз в три часа обновляется.






Идея 2.


Сделайте событие при сбросе кеша по тегу.

Я бы написал обработчик запрещающий сбрасывать кеш по тегу, пока идет обмен с 1С. А сбросил бы кеш позже сам.
Рейтинг: -1  
Ответил 17.11.2014 14:56:02
Как бы механизм отключения тегирования у инфоблоков есть, или он не решает вашей проблемы:
CIblock::DisableTagCache($iblock_id)
 
Рейтинг: 0.6892  
Ответил Жуков Евгений 21.04.2015 19:06:11
iblock 15.0.7 - добавлена возможность управления сбросом тегированного кеша на хите. Добавлены методы CIBlock::enableClearTagCache(), CIBlock:: DisableClearTagCache(), CIBlock::isEnabledClearTagCache(), CIBlock::clearIblockTagCache().
Рейтинг: 0  
Ответил Жуков Евгений 14.06.2019 17:24:02
Связка catalog 19.0.0 + iblock 19.0.0 - добавлено управление сбросом тегированного кеша при обмене с 1С.

Рейтинг: 0  
Зайцев Артемий 17.11.2014 17:37:36
Юрий, спасибо за совет про
CIblock::DisableTagCache

Но это не решает всей задачи. Я бы хотел, чтобы компонент фильтр вообще не зависел ни от каких тегов, а компонент списка товаров зависел.

Что-то типа:

1. CCache::DisableCacheTag // в начале
2. Компонент фильтр
3. CCache::EnableCacheTag // в конце
4. Список товаров
Или лучше опцию в компоненте, чтобы не думать.


Компонент фильтра со всеми вариантами в моем случае  дает гораздо большую нагрузку, чем список товаров.

Странно что для метода
CIblock::DisableTagCache
нет парного:
 CIblock::EnableTagCache



Полная реализация получилась такой:


<?
// CIBlock::$disabledCacheTag - Переменная protected
class CMyExtendedIblock extends CIBlock
{  
 function myEnableCacheTag($id)
 {
  $id = intval($id);
  if ( isset( CIBlock::$disabledCacheTag[$id] ) )
  {
   unset( CIBlock::$disabledCacheTag[$id] );
  }
 }
}

?>
 



<?
if(!CModule::IncludeModule("iblock") ) die("модуль инфоблоков не установлен");

CIblock::DisableTagCache(31);
?>

<?$APPLICATION->IncludeComponent(
 "фильтр", 
 ...
);?>

<?CMyExtendedIblock::myEnableCacheTag(31);?>

<?$APPLICATION->IncludeComponent(
 "список товаров", 
 ...
);?>

Нужно какое-то кошерное решение от Битрикса вместо такого костыля.