Эффективное кэширование в Bitrix D7: простой и тегированный кэш

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


Зачем нужно кэширование?

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


Простой кэш с использованием Bitrix\Main\Data\Cache

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

use Bitrix\Main\Data\Cache;


$cache = Cache::createInstance();
$cacheTime = 7200; // 2 часа
$cacheId = 'blog-tags';
$cacheDir = '/custom/blog-tags/';


if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
    // Кэш есть — получаем результат
    $vars = $cache->getVars();
    $this->arResult = $vars['result'];
} elseif ($cache->startDataCache()) {
    // Кэш отсутствует — выполняем тяжелые действия
    $this->arResult['tags'] = ['content']; // Пример данных
    $cache->endDataCache(['result' => $this->arResult]);
}


Кэш при использовании ORM D7

В Bitrix ORM (D7) кэширование можно указать прямо в параметрах getList.

use Bitrix\Main\GroupTable;


$res = GroupTable::getList([
    'select' => ['ID', 'NAME'],
    'order' => ['C_SORT' => 'ASC'],
    'cache' => [
        'ttl' => 3600, // 1 час
        'cache_joins' => true, // если есть JOIN
    ],
]);

Этот подход автоматически кеширует результат ORM-запроса.



Тегированный кэш: гибкий и управляемый

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

use Bitrix\Main\Data\Cache;
use Bitrix\Main\Application;


$cache = Cache::createInstance();
$cacheTime = 7200;
$cacheId = 'blog-tags';
$cacheDir = '/custom/blog-tags/';
$taggedCache = Application::getInstance()->getTaggedCache();


if ($cache->initCache($cacheTime, $cacheId, $cacheDir)) {
    $vars = $cache->getVars();
    $this->arResult = $vars['result'];
} elseif ($cache->startDataCache()) {
    // Начало тегирования
    $taggedCache->startTagCache($cacheDir);
    $taggedCache->registerTag('iblock_id_4'); // Привязка к инфоблоку
    $taggedCache->endTagCache();


    $this->arResult['tags'] = ['content']; // Пример данных
    $cache->endDataCache(['result' => $this->arResult]);
}

 Если элемент инфоблока будет обновлён, кэш с этим тегом сбросится.


Кэширование — необходимый элемент при разработке производительного проекта на 1C-Bitrix. Используя как простой, так и тегированный кэш, вы можете значительно сократить нагрузку на сервер и ускорить отклик сайта. Применяйте подходящий вид кэша в зависимости от сценария, и вы добьётесь ощутимого прироста производительности.

129