Хочу выложить маленький снипет кода для кэширования.
Кэш это наше все. У битрикса есть система кэширования компонентов, она немного заточена под сами компоненты, в этом примере я не буду рассматривать. У нее есть свои плюсы и свои минусы, я расскажу о них чуть позже.
Этот код можно использовать если вы пишите на голом 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 :)
Стоит еще учитывать, что путь к кешу должен начинаться с SITE_ID. Иначе если потом в настройках нажимать «очистить весь кеш», он может не почиститься.