198  /  382
Справочник

Кеширование компонентов

Просмотров: 37907
Дата последнего изменения: 09.11.2023
Александр Суворов
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
1
2
3
4
5
Недоступно в лицензиях:
Ограничений нет

Автокеширование

Автокеширование может выключаться глобально на весь сайт одной кнопкой в административной части на странице Автокеширование Настройки > Настройки продукта > Автокеширование.

Как правило на этапе разработки оно выключено, и включается перед сдачей проекта. Не стоит питать иллюзий относительно того, что Bitrix Framework сам будет выбирать время кеширования и подходящий момент для очистки кеша. Это может делать только разработчик решения, основываясь на реальных потребностях конкретного проекта: необходимо указывать в настройках компонентов время кеширования, адекватное периодичности обновления информации.

Устройство и место хранения

Кеш компонентов хранится в файлах в папке /bitrix/cache.

Идентификатор кеша компонента формируется на основе следующих параметров:
  • ID текущего сайта, который определяет путь к файлу с кешем. (Есть возможность использовать альтернативные способы хранения, но от этого не зависит работа с компонентами).
  • имени компонента,
  • имени шаблона компонента,
  • параметров компонента,
  • внешних условий, которые определяются в компоненте (например, список групп, к которым привязан текущий пользователь).

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

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

Непосредственно после добавления/изменения элемента инфоблока в административной части кеш публичных компонентов не сбрасывается. Образно это объясняется тем, что инфоблок Новости "не знает", где выводятся новости в публичной части и сколько компонентов их отображает. Это не проблема если время кеширования выставлено правильно.

Структурная схема

Структурная схема работы компонента

В $arParams содержится набор параметров компонента, component.php работает с входными параметрами запроса и базой данных, формирует результат в массив $arResult. Шаблон компонента преобразует результат в текст HTML.

При первом хите сформированный HTML попадает в кеш. При последующих хитах запросов в базу не делается (или делается мало), данные читаются из кеша.

Внимание! Учтите порядок выполнения, в этом случае код шаблона компонента и result_modifier.php не исполняются.

Типичная ошибка: в шаблоне компонента вызываются отложенные функции: $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));
	}
}

Список ссылок по теме:





30
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии