1c-bitrix / php · 07.01.2010

Кэш [bitrix api]

Хочу выложить маленький снипет кода для кэширования.

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

Этот код можно использовать если вы пишите на голом API битрикса обвертки для какого -то сложного функционала.


$obCache = new CPHPCache;
$sCacheTime = 3600;
$sCacheID = $SectionView . "." . $iCountPageElement . "." . $sSort . '.' . CDBResult::NavStringForCache($iCountPageElement);
if($obCache->InitCache($sCacheTime, $sCacheID, "/response/GetList/"))
{
$vars = $obCache->GetVars();
return $vars['ARRAY'];
}
else
{
/*
* код по выборке элементов
*/
if($obCache->StartDataCache())
{
$obCache->EndDataCache(array("ARRAY" => $arResultFieldValue));
return $arResultFieldValue;
}
}

Немного поясню,

$sCacheTime — время кэширвания

$sCacheID — ID кэша, т.е. должны быть перечисленны все параметры при которых меняется вывод,  но не забываем если у вас 10 000 пользователей и вы в ID кэша указали $iUserID то он сделает 10000 копий кэша этого вывода, если на него зайдут все 10000 пользователей.

CDBResult::NavStringForCache($iCountPageElement);  — если используется по страничка то это включаем, иначе будет кэшировать цепочку. $iCountPageElement) — кол- во элементов на странице

«/response/GetList/» — пусть куда складываем кэш, относительно папки /bitrix/cache/

$obCache->EndDataCache(array(«ARRAY» => $arResultFieldValue)); — эта функция как раз и записывает ваш результирующий массив в кэш, а эта if($obCache->InitCache($sCacheTime, $sCacheID, «/response/GetList/»)) проверяет есть ли кэш и если он есть возвращает закэшированный массив.

Все достаточно просто,  если нужно очистить кэш, то имеется функция  BXClearCache();

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

Вот пожалуй и все что хотел сказать по этому поводу.