Кэш [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();

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

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

  • Написал на голом АПИ компоненту, но там аяксовые ссылки сохраняются в сессии пользователя, поэтому работает компонент так как хочется при отключенном кешировании, но это вариант нехороший, так как посещаемость ресурса растет и народ активно пользуется компонентой (http://dokurgan.ru/afisha/cinema/). На форуме битрикса как то помню находил что то про некешируемые области в коде, не знаете подобных решений? Не нашел ваших контактов, хочется пообщаться со спецом, icq 4306445, стучите, пообщаемся, обменяемся опытом
     

  • Решение есть, напишу конечно отдельный пост на эту тему.

    Написал в аську, если что тут http://yunaliev.moikrug.ru/ есть контактные данные. Все нет времени заняться блогом :)

  • Я там не могу видеть контактных данных, если не на первом круге :( В аську ничего не приходило, к сожалению… Я в моем круге добавился кстати
     

  • Сделал страницу контактов, желательно пишите на email :)

  • Jey007

    Стоит еще учитывать, что путь к кешу должен начинаться с SITE_ID. Иначе если потом в настройках нажимать «очистить весь кеш», он может не почиститься.