Bitrix: ускоряем каталог через кеш компонентов и теги (практ

Каталог — одна из самых ресурсоёмких страниц: фильтры, цены, офферы, сортировка, пагинация. Без кеша выполняются сотни запросов к БД, а время до первого байта получается нестабильным. Ниже — практичный план: что включить «из коробки», как кешировать кастомные выборки на D7 и как собирать ключ без ошибок.

Когда кеш особенно помогает

• Листинги 100+ товаров с активным фильтром по свойствам. • Частые переключения офферов, цен и сортировок. • Пиковая нагрузка (акции/реклама), когда важно держать стабильный TTFB.

Ориентир из практики: SQL можно снизить со 150–300 до 10–40, TTFB — с ~900 мс до ~300–450 мс.

Включаем готовый кеш в компонентах

У стандартных компонентов кеш уже есть — включаем и подбираем TTL.

$APPLICATION->IncludeComponent( "bitrix:catalog.section", ".default", [ "IBLOCK_TYPE" => "catalog", "IBLOCK_ID" => 7, "FILTER_NAME" => "arrFilter", "INCLUDE_SUBSECTIONS" => "Y",

// Кеш "CACHE_TYPE" => "A", // A — авто; Y — всегда; N — выкл "CACHE_TIME" => 3600, // TTL (сек) "CACHE_FILTER" => "Y", // кешировать результаты с фильтром "CACHE_GROUPS" => "Y", // учитывать группы пользователя

"PRICE_CODE" => ["BASE"], "PAGE_ELEMENT_COUNT" => 24, ], false );

Подбор значений: • CACHE_TYPE: чаще A (авто) или Y (жёстко). • CACHE_TIME: списки 1800–7200 сек, справочники 12–24 ч. • CACHE_GROUPS: Y, если контент/цены зависят от прав.

Ручной кеш на D7 + тегированный кеш

Кастомные блоки (подборки, «похожие», виджеты вокруг каталога) кешируем через Bitrix\Main\Data\Cache и регистрируем теги для авто-инвалидации. $IBLOCK_ID, 'ACTIVE' => 'Y', 'SECTION_ID' => $sectionId]; $sort = ['SORT' => 'ASC', 'ID' => 'DESC']; $select = ['ID','IBLOCK_ID','NAME','DETAIL_PAGE_URL','PREVIEW_PICTURE','PROPERTY_BRAND']; $nav = ['nPageSize' => 24, 'iNumPage' => (int)($_GET['PAGEN_1'] ?? 1)];

$cacheId = 'v1:' . md5(serialize([ $filter, $sort, $select, $nav, 'UG' => $USER->GetUserGroupArray(), // если права/цены зависят от групп ]));

$cache = Cache::createInstance();

if ($cache->initCache($ttl, $cacheId, $cacheDir)) { $data = $cache->getVars(); } elseif ($cache->startDataCache()) {

$items = []; $rs = CIBlockElement::GetList($sort, $filter, false, $nav, $select); while ($el = $rs->GetNext()) { $items[] = $el; }

// Тегированный кеш: при изменениях в ИБ — автоматическая очистка $tagged = Application::getInstance()->getTaggedCache(); $tagged->startTagCache($cacheDir); $tagged->registerTag('iblock_id'.$IBLOCK_ID); if ($sectionId) { $tagged->registerTag('iblock_id'.$IBLOCK_ID.'section'.$sectionId); } $tagged->endTagCache();

$data = ['items' => $items, 'nav' => $rs->NavString()]; $cache->endDataCache($data); }

// Вывод foreach ($data['items'] as $item) { // карточка товара } echo $data['nav'];

Ключ кеша: что обязательно учесть

• Фильтр, сортировка, номер страницы. • Группы пользователя (права доступа, персональные цены). • Регион/валюта, если от них зависят цены/наличие. • Вариант шаблона, если он меняет набор данных или разметку.

Избегайте «шума» в ключе: UTM, случайные токены, сессионные флаги — это раздробит кеш на множество бесполезных вариантов.

Как зафиксировать эффект (до/после)

• Панель производительности — общее время и количество SQL. • perfmon_list.php — самые тяжёлые запросы. • DevTools/веб-инспектор — TTFB и waterfall. Рекомендую приложить два скриншота «до/после» — это наглядно и понятно.

Итог

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