Блог Горошко Андрея 1C-Битрикс Кэширование в Битрикс: От CPHPCache до Bitrix\Main\Data\Cache на D7

Кэширование в Битрикс: От CPHPCache до Bitrix\Main\Data\Cache на D7

Средний рейтинг
Еще нет оценок

Любой производительный сайт на Битрикс активно использует кэширование. Это позволяет избежать повторного выполнения «тяжелых» операций (например, запросов к базе данных) и отдавать пользователю заранее сохраненный результат. В Битрикс есть два основных способа работы с кэшем: классический (CPHPCache) и современный, на ядре D7 (Bitrix\Main\Data\Cache).

Основной принцип кэширования

Логика работы в обоих случаях практически идентична и состоит из трех шагов:

  1. Проверить, есть ли валидный кэш. Если да, то взять данные из него.
  2. Если кэша нет, начать его запись. Выполнить «тяжелые» операции и получить нужные данные.
  3. Завершить запись кэша, сохранив полученные данные для будущих обращений.

Часть 1. Классический подход (CPHPCache)

Этот способ используется в старом API и до сих пор актуален во многих компонентах и скриптах.

Логика работы:

$cacheTime = 3600; // Время жизни кэша в секундах (1 час)
$cacheId = 'my_unique_cache_id_'.serialize($arParams); // Уникальный ID кэша
$cacheDir = '/my_cache_dir/'; // Директория для хранения файлов кэша

$obCache = new CPHPCache();

// 1. Пытаемся получить данные из кэша
if ($obCache->InitCache($cacheTime, $cacheId, $cacheDir)) {
    $vars = $obCache->GetVars();
    $arResult = $vars['AR_RESULT']; // Извлекаем наши сохраненные данные
} 
// 2. Если кэша нет, начинаем его запись
elseif ($obCache->StartDataCache()) {
    
    // --- Здесь идет "тяжелая" логика ---
    // Например, выборка элементов из инфоблока
    $arResult = [];
    $rsElements = CIBlockElement::GetList(...);
    while($arElement = $rsElements->Fetch()){
        $arResult[] = $arElement;
    }
    // ------------------------------------
    
    // 3. Сохраняем результат в кэш
    $obCache->EndDataCache(['AR_RESULT' => $arResult]);
}

// Теперь в $arResult у нас есть данные, либо из кэша, либо "свежие"
print_r($arResult);

Ключевые моменты:

  • $cacheId: Должен быть уникальным для каждого набора параметров. Если параметры меняются, ID кэша тоже должен меняться, иначе вы получите старые данные. Часто для этого используют serialize($arParams).
  • $cacheDir: Помогает организовать файлы кэша в структурированные папки.

Часть 2. Современный подход (Bitrix\Main\Data\Cache)

Синтаксис D7 более лаконичен и соответствует современным стандартам PHP.

Логика работы:

use Bitrix\Main\Data\Cache;

$cacheTime = 3600;
$cacheId = 'my_unique_cache_id_d7_'.serialize($someParams);
$cacheDir = '/my_cache_dir_d7/';

$cache = Cache::createInstance(); // Создаем объект кэша

if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
    $arResult = $cache->getVars(); // Получаем переменные из кэша
} 
elseif ($cache->startDataCache()) {
    
    // --- "Тяжелая" логика на D7 ORM ---
    $arResult = [];
    $result = \Bitrix\Iblock\ElementTable::getList(...);
    while ($row = $result->fetch()) {
        $arResult[] = $row;
    }
    // ----------------------------------
    
    // Проверка на случай, если данные не найдены (чтобы не создавать пустой кэш)
    if (empty($arResult)) {
        $cache->abortDataCache();
    }
    
    $cache->endDataCache($arResult); // Сохраняем массив напрямую
}

print_r($arResult);

Как видите, логика абсолютно та же. Разница в основном в создании объекта (new CPHPCache() vs Cache::createInstance()) и методах (GetVars vs getVars, StartDataCache vs startDataCache). D7 версия выглядит немного чище и не требует оборачивать результат в дополнительный массив.

Управление кэшем

  • Прервать кэширование: Если в процессе получения данных вы поняли, что кэшировать нечего (например, выборка пустая), вызовите $cache->abortDataCache(). Это предотвратит создание пустого файла кэша.
  • Сброс кэша: Для ручного сброса кэша можно просто удалить соответствующий файл или папку ($cacheDir) на сервере.
  • Тегированный кэш: Для умного сброса кэша (например, сбросить кэш списка новостей при добавлении новой) используется механизм тегированного кэширования (TaggedCache). Это более продвинутая тема, но ее стоит изучить для создания по-настоящему быстрых сайтов.

Заключение:
Неважно, какой способ вы выберете, — главное кэшировать. Для новых проектов предпочтительнее использовать Bitrix\Main\Data\Cache, так как он соответствует современному стилю D7. Для поддержки старого кода знание CPHPCache обязательно. Правильное кэширование — самый простой и эффективный способ ускорить ваш сайт на Битрикс.

Кэширование Битрикс, CPHPCache, Bitrix\Main\Data\Cache, initCache, startDataCache, getVars, endDataCache, производительность Битрикс, тегированный кеш.

Мой рейтинг:

Добавить комментарий

Related Post

Создание Highload-блоков в Битрикс с помощью phpСоздание Highload-блоков в Битрикс с помощью php

Средний рейтинг Еще нет оценок Highload-блоки (HL-блоки) в Битрикс — мощный инструмент для работы с большими объемами структурированных данных. В этой статье разберем, как программно создавать HL-блоки с кастомными полями,

Продажа маркированных товаров онлайн битриксПродажа маркированных товаров онлайн битрикс

Средний рейтинг Еще нет оценок Если вы используете эквайринг Сбербанка для оплаты онлайн на сайте 1С-Битрикс Управление сайтом и желаете продавать маркированные товары, то: У меня есть опыт реализации подобных

Обновление количества товара на складе в BitrixОбновление количества товара на складе в Bitrix

Средний рейтинг Еще нет оценок Обновление количества товара на складе в Bitrix можно сделать так В коде ниже происходит следующее: Мой рейтинг: