Система Битрикс включает в себя разные технологии кэширования. Кэширование позволяет уменьшить нагрузку на аппаратные ресурсы (за исключением файловой системы разумеется), таким образом влияя на время отклика сайта. Как правило, кэширование используется как в стандартных компонентах системы, так и в компонентах, разработанных под свои нужды. Результаты ресурсоемких, а так же редко обновляемых кусков кода заносятся в кэш, при повторном запросе, готовый результат может выдаваться из кэша, и при больших нагрузках на сайт прирост производительности за счет кэширования становиться очевидным. Сделать кэширование должным образом — дело ювелирное, но отчаиваться не стоит — всё приходит с опытом.
По умолчанию для кэширования в Битрикс-е созданы два класса, это CPageCache и CPHPCache. Первый служит для кеширования HTML, второй для кэширования HTML и PHP переменных.
Файлы кэша записываются в каталог /bitrix/cache/. Если время кэширования не истекло, то вместо ресурсоемкого кода будет подключен предварительно созданный файл кэша. Стоит заметить, что неразумное использование кэширования может привести к значительному увеличению размера каталога с файлами кэша.
HTML кэширование:
# создаем объект
$obCache = new CPageCache;
# время кеширования в секундах
$lifeTime = 30*60;
# формируем ID кеша в зависимости от всех параметров
# которые могут повлиять на результирующий HTML
$cacheID = $arParams['ELEMENT_ID'].$arParams['IBLOCK_TYPE'];
# инициализируем буферизирование вывода
if($obCache->StartDataCache($lifeTime, $cacheID, "/")){
#
# Сюда помещается ресурсоёмкий код, с выводом результата
#
# записываем предварительно буферизированный вывод в файл кеша
$obCache->EndDataCache();
}
Кэширование HTML и PHP переменных:
# создаем объект
$obCache = new CPHPCache;
# время кеширования в секундах
$lifeTime = 30*60;
# формируем идентификатор кеша в зависимости от всех параметров
# которые могут повлиять на результирующий HTML
$cacheID = $arParams['ELEMENT_ID'].$arParams['SECTION_ID'];
# если кеш есть и он ещё не истек то
if($obCache->InitCache($lifeTime, $cacheID, "/")){
# получаем закешированные переменные
$vars = $obCache->GetVars();
$SECTION_TITLE = $vars["SECTION_TITLE"];
} else {
# иначе обращаемся к базе
$arSection = GetIBlockSection($arParams['SECTION_ID']);
$SECTION_TITLE = $arSection["NAME"];
}
# добавляем пункт меню в навигационную цепочку
$APPLICATION->AddChainItem($SECTION_TITLE, $SECTION_URL."SECTION_ID=".$arParams['SECTION_ID']);
# начинаем буферизирование вывода
if($obCache->StartDataCache()){
# выбираем из базы параметры элемента инфоблока
if($arIBlockElement = GetIBlockElement($arParams['ELEMENT_ID'], $IBLOCK_TYPE)){
echo "<pre>"; print_r($arIBlockElement); echo "</pre>";
}
# записываем предварительно буферизированный вывод в файл кеша
# вместе с дополнительной переменной
$obCache->EndDataCache(array(
"SECTION_TITLE" => $SECTION_TITLE
));
}