Автоматическая очистка тегированного кеша для элементов с датой начала активности в будущем
Автоматическая очистка тегированного кеша для элементов с датой начала активности в будущем
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.
Автоматическая очистка тегированного кеша для элементов с датой начала активности в будущем
При использовании тегированного кеширования время жизни кешей обычно делают большим. Из-за этого возникает проблема с новостями, которые размещают на сайте заранее. Например, если редактор сайта в пятницу написал новость, которая должна появиться на сайте в воскресенье, для чего выставил ей соответствующую дату начала активности, то при дефолтных настройках битрикса в воскресенье эта новость на сайте не появится, поскольку кеш не сбросится.
Решение под катом. На каждый элемент, дата начала активности которого находится в будущем, создаём агент, который в момент наступления нужной даты будет сбрасывать тегированный кеш соответствующего инфоблока.
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) Если вы будете менять названия класса и/или функции, вызываемой агентом, не забудьте поправить строку