Медленный каталог на 1С-Битрикс: с чего начать диагностику
Медленный каталог на 1С-Битрикс редко тормозит “просто потому что Битрикс”. Обычно есть конкретная причина: тяжёлый умный фильтр, слишком много свойств, отключённый или неправильно настроенный кэш, торговые предложения, большие изображения, отсутствие индексов или кастомный код в result_modifier.php.
Оптимизацию лучше начинать с замеров. Если сразу менять параметры компонента наугад, можно ускорить одну страницу и сломать другую.
Понять, какая страница тормозит
Каталог состоит из разных страниц: список разделов, раздел с товарами, карточка, фильтр, поиск, AJAX-подгрузка. У каждой может быть своя причина.
- главная страница каталога;
- раздел без фильтра;
- раздел с фильтром;
- карточка товара;
- страница с торговыми предложениями;
- AJAX-запрос сортировки или пагинации.
Для начала нужно замерить время конкретного URL и сравнить с похожими страницами.
curl -o /dev/null -s -w "%{time_total}\n" https://example.ru/catalog/section/
Кэш компонента
В параметрах bitrix:catalog, bitrix:catalog.section и bitrix:catalog.smart.filter нужно проверить CACHE_TYPE и CACHE_TIME. Если кэш выключен на большом каталоге, сайт будет каждый раз собирать данные заново.
'CACHE_TYPE' => 'A',
'CACHE_TIME' => 36000000,
'CACHE_GROUPS' => 'Y',
CACHE_GROUPS влияет на кэширование с учётом групп пользователей. Если для гостей и авторизованных пользователей данные одинаковые, настройки можно пересмотреть, но только после проверки прав и цен.
Умный фильтр
Умный фильтр может быть самым тяжёлым местом каталога. Особенно если в фильтр выведены десятки свойств, у каждого свойства много значений, а каталог большой.
Что стоит проверить:
- сколько свойств участвует в фильтре;
- не попали ли туда служебные свойства;
- нужен ли подсчёт количества товаров по каждому значению;
- используется ли AJAX;
- есть ли свойства с тысячами уникальных значений.
На практике фильтр лучше держать полезным для покупателя, а не выводить туда всё, что есть в инфоблоке.
Торговые предложения
SKU усложняют выборку. Если у товара много предложений, цен, остатков и свойств, компонент может собирать большой объём данных.
Проверьте, какие поля и свойства реально нужны в списке товаров. Не обязательно тянуть в раздел всё, что нужно только в карточке.
'OFFERS_FIELD_CODE' => ['ID', 'NAME'],
'OFFERS_PROPERTY_CODE' => ['COLOR', 'SIZE'],
Чем меньше лишних свойств в выборке, тем проще компоненту.
result_modifier.php и component_epilog.php
В шаблонах компонентов часто лежит кастомная логика. Там могут быть дополнительные запросы в цикле, загрузка картинок, расчёт остатков или обращение к внешнему API.
grep -R "CIBlockElement::GetList" -n local/templates
grep -R "foreach" -n local/templates/*/components
Если внутри цикла товаров выполняется отдельный запрос по каждому элементу, это типичная причина медленной страницы.
Изображения
Иногда каталог тормозит не на PHP, а в браузере. Список может отдавать оригинальные изображения вместо превью.
CFile::ResizeImageGet(
$fileId,
['width' => 300, 'height' => 300],
BX_RESIZE_IMAGE_PROPORTIONAL,
true
);
Важно не генерировать изображения заново на каждом запросе. Результаты ресайза должны кэшироваться.
SQL и индексы
Если есть подозрение на базу, нужно смотреть медленные запросы. На сервере может быть включён slow query log. Также помогают инструменты мониторинга производительности Битрикс.
SHOW FULL PROCESSLIST;
Самостоятельно добавлять индексы в системные таблицы Битрикс нужно осторожно. Сначала нужно понять конкретный запрос и риск обновлений.
Чек-лист диагностики
- Замерить конкретный медленный URL.
- Проверить кэш компонента каталога и фильтра.
- Сократить лишние свойства в фильтре.
- Проверить SKU и состав выбираемых свойств.
- Проверить кастомный код в шаблоне компонента.
- Найти запросы внутри циклов товаров.
- Проверить размеры изображений.
- Посмотреть slow query log или processlist.
Медленный каталог почти всегда можно разложить на несколько конкретных причин. Главное — не выключать всё подряд, а проверить кэш, фильтр, шаблон, изображения и SQL по отдельности.
Комментарии (0)
Пока нет комментариев. Будьте первым!