+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Автоматическая очистка тегированного кеша для элементов с датой начала активности в будущем

При использовании тегированного кеширования время жизни кешей обычно делают большим. Из-за этого возникает проблема с новостями, которые размещают на сайте заранее. Например, если редактор сайта в пятницу написал новость, которая должна появиться на сайте в воскресенье, для чего выставил ей соответствующую дату начала активности, то при дефолтных настройках битрикса в воскресенье эта новость на сайте не появится, поскольку кеш не сбросится.

Решение под катом.

На каждый элемент, дата начала активности которого находится в будущем, создаём агент, который в момент наступления нужной даты будет сбрасывать тегированный кеш соответствующего инфоблока.
AddEventHandler('iblock', 'OnAfterIBlockElementAdd', array('CMyCache', 'AddClearingAgent'));
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', array('CMyCache', 'AddClearingAgent'));

class CMyCache
{

   // При добавлении/редактировании элемента с датой создания в будущем...
   // ...добавляем агент на очистку тегированного кеша.
   // Агент взводится на каждый элемент отдельно.
   function AddClearingAgent(&$arFields)
   {
      if (!defined('BX_COMP_MANAGED_CACHE'))
         return true;
      $ID = array_key_exists('ID', $arFields) ? $arFields['ID'] : false;
      $IBLOCK_ID = array_key_exists('IBLOCK_ID', $arFields) ? $arFields['IBLOCK_ID'] : false;
      $date = array_key_exists('ACTIVE_FROM', $arFields) ? MakeTimeStamp($arFields['ACTIVE_FROM']) : 0; 
      if ($ID && $IBLOCK_ID && $date > time())
      {
         $agentName = "CMyCache::ClearCacheByIBlockID($IBLOCK_ID, $ID);";
         // удаляем агент, если он есть
         CAgent::RemoveAgent($agentName, 'main');
         // добавляем агент
         CAgent::AddAgent(
            $agentName,
            'main',
            'N',
            0,
            '',
            'Y',
            ConvertTimeStamp($date, 'FULL')
         );
      }
   }

   // функция, вызываемая агентом
   function ClearCacheByIBlockID($IBLOCK_ID, $ID)
   {
      if (defined('BX_COMP_MANAGED_CACHE') && is_object($GLOBALS['CACHE_MANAGER']))
         $GLOBALS['CACHE_MANAGER']->ClearByTag('iblock_id_'.$IBLOCK_ID);
      return '';         
   }

}

Примечания.

1) Этот код может работать неправильно, если ваше локальное время отличается от времени на сервере.
2) Если вы будете менять названия класса и/или функции, вызываемой агентом, не забудьте поправить строку
$agentName = "CMyCache::ClearCacheByIBlockID($IBLOCK_ID, $ID);";


Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA