CPageCache и CPHPCache

May 21, 2015

Система Битрикс включает в себя разные технологии кэширования. Кэширование позволяет уменьшить нагрузку на аппаратные ресурсы (за исключением файловой системы разумеется), таким образом влияя на время отклика сайта. Как правило, кэширование используется как в стандартных компонентах системы, так и в компонентах, разработанных под свои нужды. Результаты ресурсоемких, а так же редко обновляемых кусков кода заносятся в кэш, при повторном запросе, готовый результат может выдаваться из кэша, и при больших нагрузках на сайт прирост производительности за счет кэширования становиться очевидным. Сделать кэширование должным образом — дело ювелирное, но отчаиваться не стоит — всё приходит с опытом.

По умолчанию для кэширования в Битрикс-е созданы два класса, это 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 "";
    }
    # записываем предварительно буферизированный вывод в файл кеша
    # вместе с дополнительной переменной
    $obCache->EndDataCache(array(
        "SECTION_TITLE" => $SECTION_TITLE
    ));
}?>


 

Комментарии

comments powered by Disqus