Выборки из инфоблоков — самая частая нагрузка на базу данных сайта. Кэширование компонентов позволяет отдавать готовый результат без повторных запросов к БД и заметно ускоряет каталог, новости и любые списки элементов.
Зачем кэшировать выборки из инфоблоков
Каждый вывод списка элементов или детальной страницы через компоненты вроде bitrix:news.list или bitrix:catalog по умолчанию обращается к базе данных. На нагруженном каталоге это десятки и сотни запросов на одну страницу.
Кэширование сохраняет результат выборки в файл (или в другое хранилище) и при повторных обращениях отдаёт его напрямую, минуя SQL-запросы и разбор данных. Это даёт:
- снижение числа запросов к базе данных;
- меньшую нагрузку на процессор при формировании HTML;
- ускорение отклика страниц каталога и списков.
Для инфоблоков это особенно важно: свойства, привязки к разделам и фильтрация порождают тяжёлые запросы, которые дорого выполнять на каждый хит.
Включение автокэширования на сайте
Глобальный переключатель находится в административном разделе. Без него настройки кэша в компонентах игнорируются.
- Перейдите в Настройки → Настройки продукта → Автокэширование.
- Нажмите Включить автокэширование.
- Проверьте тип хранилища кэша в Настройки → Настройки продукта → Настройки модулей → Главный модуль — по умолчанию используются файлы, но при высокой нагрузке лучше подключить memcached или Redis.
После включения на публичной части появится панель управления кэшем: авторизованный администратор может сбросить кэш конкретной области кнопкой на всплывающей панели компонента.
Настройка кэша в компонентах инфоблоков
Каждый компонент, работающий с инфоблоками, имеет собственную группу параметров кэширования. Откройте компонент на редактирование (режим правки → Настроить) и найдите блок Настройки кэширования.
Основные параметры:
| Параметр | Назначение |
|---|---|
| Тип кэширования | Авто, Кэшировать или Не кэшировать. Для боевого сайта — Авто. |
| Время кэширования (сек) | Срок жизни кэша, например 36000000 — фактически «до сброса». |
| Кэшировать на группы | Отдельный кэш для разных групп пользователей (цены, доступ). |
| Учитывать права доступа | Кэш с учётом прав на элементы инфоблока. |
Ставить малое время кэширования (60–300 секунд) имеет смысл только там, где нет автоочистки. Обычно надёжнее большое время плюс автоматический сброс при изменении данных.
Автоматическая очистка кэша при изменении данных
Ключевая настройка для инфоблоков — сброс кэша при редактировании элементов, чтобы посетители не видели устаревшие данные.
- Откройте Настройки → Настройки продукта → Настройки модулей → Информационные блоки.
- Найдите параметр Сбрасывать кэш при обновлении элементов (тегированный кэш) и включите его.
- Сохраните настройки.
После этого при добавлении, изменении или удалении элемента система сама очистит связанные с ним кэши. Пользователю не нужно вручную сбрасывать кэш компонента.
Важно: тегированный кэш требует хранилища, поддерживающего теги. При файловом кэше теги работают, но при высокой нагрузке рекомендуется вынести кэш и теги в managed-хранилище (memcached/Redis) через настройки главного модуля.
Теговый кэш в собственном коде
Если вы делаете выборку через API инфоблоков вне штатных компонентов, кэш и его теги нужно регистрировать вручную. Общая схема на управляемом кэше:
- оберните выборку в
$cache->startDataCache()/endDataCache(); - внутри блока запустите
$taggedCache->startTagCache(); - зарегистрируйте тег инфоблока функцией
registerTag("iblock_id_" . $IBLOCK_ID); - завершите тегирование
endTagCache().
Тег вида iblock_id_ID система автоматически сбрасывает при изменении любого элемента этого инфоблока — при условии, что включена тегированная очистка кэша в настройках модуля. Так собственные выборки очищаются синхронно со штатными компонентами.
Частые ошибки
На что чаще всего наступают при настройке кэширования инфоблоков:
- Автокэширование выключено. Настройки кэша в компонентах не действуют, пока не включён глобальный режим.
- Нет автоочистки. При большом времени кэша и выключенной тегированной очистке посетители видят старые данные до ручного сброса.
- Кэш не учитывает группы. Разные цены или права выводятся из одного кэша — покупатель видит чужую цену. Включите «Кэшировать на группы».
- Динамика внутри кэшируемой области. Корзина, счётчик просмотров, персональные блоки нужно выносить из кэша через отложенные функции, иначе они «замерзают».
- Фильтр в GET не участвует в ключе кэша. Результаты умного фильтра кэшируются одинаково для разных условий — проверьте, что параметры выборки входят в ключ.
- Файловый кэш на нагруженном сайте. Тысячи мелких файлов тормозят ФС; переносите кэш в memcached/Redis.
Как проверить, что кэш работает
После настройки убедитесь, что выборки действительно кэшируются:
- Включите Настройки → Инструменты → Отладка → Показывать отладочную информацию или debug-панель.
- Откройте страницу каталога дважды: на втором заходе число SQL-запросов должно резко уменьшиться.
- Наведите на компонент в режиме правки — на панели видно, отдана страница из кэша или пересобрана.
- Отредактируйте элемент инфоблока и обновите страницу — данные должны обновиться сразу, если включена тегированная очистка.
Разницу во времени генерации страницы также показывает нижняя отладочная панель: «время создания страницы» и число запросов к БД до и после.
Итог
Кэширование выборок из инфоблоков сводится к трём шагам: включить автокэширование на сайте, настроить кэш в компонентах и включить тегированную очистку при изменении элементов. Такая связка даёт большой срок жизни кэша без риска показать устаревшие данные.
Для собственных выборок используйте управляемый кэш с тегом инфоблока, выносите динамику из кэшируемых областей и на нагруженных проектах переносите хранилище кэша в memcached или Redis.