Кеширование по расписанию в 1С-Битрикс

Дмитрий Рубцов

Технический консультант

Кеширование по расписанию в 1С-Битрикс

Введение

Кеширование — технология, повышающая производительность системы за счёт отказа от повторных запросов к базе данных. Применяется в тех случаях, когда чтение информации с диска (созданного кеша) производительнее обращения к базе. Такое бывает, например, при большом количестве запросов, когда на создание одной страницы для одного пользователя, требуется более 200 запросов. Для отображения этой же страницы для 10 пользователей, потребуется в 10 раз больше ресурсов. Кеширование позволяет снять эту проблему — большинству пользователей будет отображена сохранённая копия, на создание которой не потребуются запросы.

В 1С-Битриксе реализовано несколько типов кеша, таких как кеширование компонентов, управляемый кеш, неуправляемый кеш и другие.

Работа кеша, способы его создания

Алгоритм работы всех типов кеша одинаков — информация из базы запрашивается только один раз — при создании кеша и затем пользователям отображается уже закешированная версия — повторные обращения к базе отсутствуют. Различия типов кеширования заключаются в способе формирования кеша, связанных действиях и способе его обновления.

Кеширование компонентов (автокеширование) — встроенный в компоненты механизм, позволяющий в упрощённом режиме реализовать возможность кеширования. Вызывается одной строкой в файле компонента:

$this->StartResultCache();

Если результат этого вызова true, то это означает что кеша нет и его нужно создать. Если же результат false, то содержимое кеша будет выведено на экран и будет заполнен массив $arResult. Такой кеш зависит от параметров в массиве $arParams, сбрасывается через время, указанное в $arParams["CACHE_TIME"] и его можно централизовано включить/отключить через панель управления.

Управляемый кеш — отличается от предыдущего тем, что обновляется в момент изменения данных в инфоблоках. Для его работы необходимо определение константы define("BX_COMP_MANAGED_CACHE", true); в dbconn.php.

Неуправляемый кеш — кеширование реализуемое разработчиками компонентов для битрикса, зависит от передаваемых параметров и времени жизни кеша.

HTML кеш — кеширование целой страницы. Имеет смысл включать для редко обновляющихся страниц.

Кеширование меню — имеет собственный алгоритм кеширования. Кеш управляемый, обновляется при редактировании меню или изменении прав доступа к файлам и папкам.

Проблема с производительностью при создании кеша

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

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

Механизм принудительного создания кеша

Для реализации подобного механизма нам нужно изменить компонент, который будет выводить нашу информацию. Весь код отвечающий за заполнение массива $arResult необходимо вынести в отдельную функцию, которую мы будет вызывать при создании кеша. Ниже приведён пример кода из компонента:

$obCache = new CPHPCache;
$lifeTime = 48 * 60 * 60;
$cid = $arParams['SECTION_CODE'] . $APPLICATION->GetCurDir();

if ($obCache->InitCache($lifeTime, $cid, $APPLICATION->GetCurDir(), "mycache")) {
    $arResult = $obCache->GetVars();
} else {
    // Кеша для данного раздела не существует, можно вывести соответствующее сообщение 
    // пользователю 
}

В данном примере мы используем стандартный класс для работы с кешем. Метод InitCache проверяет наличие кеша в соответствии со своими параметрами. Если кеш есть, то она вернёт true, в другом случае — false. Параметры функции в порядке передачи: время жизни в секундах, уникальный идентификатор кеша, папка в которой хранится кеш (относительно базовой папки), базовая папка хранения кеша. По умолчанию базовая папка хранения кеша cache, но для того чтобы не путь наш кеш и кеш битрикса, мы размещаем его в отдельной папке. Папка с кешем находится в каталоге /bitrix/, следовательно весь наш кеш будет лежать в папке /bitrix/mycache/

Теперь перейдём к скрипту который делает кеш для страниц. Предположим у нас есть инфоблок с разделами и мы хотим сделать кеш страницы каждого из этих разделов. Содержимое каждого раздела отличается. Основная часть скрипта будет выглядеть следующим образом:

// время жизни кеша
$life_time = 48 * 60 * 60;

// получаем список разделов
$db_list = CIBlockSection::GetList(
    Array('name'=>'asc'),
    Array('IBLOCK_ID'=>1, "SECTION_ID"=>$IDs),
    false
);

while ($ar_result = $db_list->GetNext()) {
    // для каждого раздела строим собственный файла с кешем
    $obCache = new CPHPCache;
    
    // очищаем созданный ранее кеш, т.е. при запуске данного скрипта, кеш будет строиться
    // заново вне зависимости от времени жизни
    $obCache->CleanDir($ar_result['SECTION_PAGE_URL'], "mycache");
    
    // уникальный код кеша
    $cid = $ar_result['CODE'].$ar_result['SECTION_PAGE_URL'];
    
    // если кеша не существует, то выполним код
    if (!$obCache->InitCache($life_time, $cid, $ar_result['SECTION_PAGE_URL'], "mycache")) {
        $arParams = Array(
            "IBLOCK_ID" => 1,
            "SECTION_CODE" => $ar_result['CODE']
        );
        
        // заполнение массива данными
        $arResult = DoSomething($arParams);
        
        // сохранение данных в кеш
        $obCache->EndDataCache($arResult);
    }
    
    unset($obCache);
}

Далее нам нужно разместить данный код файле, который будет вызываться по расписанию через cron. После его запуска, мы получим в разделе /bitrix/mycache/ файлы с готовым кешем, который будет использовать наш компонент.

Источники

  1. dev.1c-bitrix.ru/learning/course/?COURSE_ID=43&LESSON_ID=3485
  2. dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2127
  3. dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2978&LESSON_PATH=3913.4565.4780.2978
  4. dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=3053
  5. www.1c-bitrix.ru/blog/rsv/2074.php

Комментарии

Тут без вас никак. Поделитесь с нами вашими мыслями

Горячие вакансии