Дата последнего изменения: 09.11.2023
Автокеширование может выключаться глобально на весь сайт одной кнопкой в административной части на странице Автокеширование Настройки > Настройки продукта > Автокеширование.
Как правило на этапе разработки оно выключено, и включается перед сдачей проекта. Не стоит питать иллюзий относительно того, что Bitrix Framework сам будет выбирать время кеширования и подходящий момент для очистки кеша. Это может делать только разработчик решения, основываясь на реальных потребностях конкретного проекта: необходимо указывать в настройках компонентов время кеширования, адекватное периодичности обновления информации.
Кеш компонентов хранится в файлах в папке /bitrix/cache
.
Зная все эти параметры, можно очистить кеш любого компонента. Иначе кеш будет сброшен по истечении времени кеширования, кнопкой обновить кеш на панели инструментов публичной части или полной очисткой кеша из административной части.
Непосредственно после добавления/изменения элемента инфоблока в административной части кеш публичных компонентов не сбрасывается. Образно это объясняется тем, что инфоблок Новости "не знает", где выводятся новости в публичной части и сколько компонентов их отображает. Это не проблема если время кеширования выставлено правильно.
Структурная схема работы компонента
В $arParams
содержится набор параметров компонента, component.php работает с входными параметрами запроса и базой данных, формирует результат в массив $arResult
. Шаблон компонента преобразует результат в текст HTML.
При первом хите сформированный HTML попадает в кеш. При последующих хитах запросов в базу не делается (или делается мало), данные читаются из кеша.
Типичная ошибка: в шаблоне компонента вызываются отложенные функции: $APPLICATION->SetTitle()
, $APPLICATION->AddChainItem()
и т.д. В этом случае они работают только при выключенном кешировании.
При разработке шаблонов собственных компонентов надо следовать простому правилу: задача шаблона - на основе входного массива $arResult
сформировать текст HTML на выходе.
В собственных компонентах надо формировать такой ID кеша, который однозначно определяет результирующий html. Но не допускайте попадание избыточных данных в ID кеша: это приводит к расходу места на диске и снижает попадания в кеш (а значит эффективность кеширования).
Пример кеширования классом CPHPCache
$cntIBLOCK_List = 10; $cache = new CPHPCache(); $cache_time = 3600; $cache_id = 'arIBlockListID'.$cntIBLOCK_List; $cache_path = 'arIBlockListID'; if ($cache_time > 0 && $cache->InitCache($cache_time, $cache_id, $cache_path)) { $res = $cache->GetVars(); if (is_array($res["arIBlockListID"]) && (count($res["arIBlockListID"]) > 0)) $arIBlockListID = $res["arIBlockListID"]; } if (!is_array($arIBlockListID)) { $res = CIBlock::GetList( Array(), Array( TYPE' => 'catalog', 'SITE_ID' => SITE_ID, 'ACTIVE' => 'Y', "CNT_ACTIVE" => "Y", "!CODE" => 'test%' ), true ); while($ar_res = $res->Fetch()) { if($ar_res['ELEMENT_CNT'] > 0) $arIBlockListID[] = $ar_res['ID']; } //////////// end cache ///////// if ($cache_time > 0) { $cache->StartDataCache($cache_time, $cache_id, $cache_path); $cache->EndDataCache(array("arIBlockListID"=>$arIBlockListID)); } }
Список ссылок по теме: