{ "index": 186, "slug": "editorial-2022-11-practice-bitrix-performance", "title": "Производительность Bitrix-страницы: как найти узкое место без оптимизации наугад", "excerpt": "Разделяем маршрут, компонент, кеш и шаблон, проверяем зависимость результата и выбираем одно обратимое действие вместо отключения кеша вслепую.", "contentHtml": "
Страница каталога открывается медленно, а в разговоре звучит только одно объяснение: «тормозит Bitrix». Такой диагноз ничего не проверяет. Он не показывает, какой URL воспроизводит симптом, какой компонент формирует блок, где срабатывает кеш и какой шаблон отдаёт HTML. Цена ошибки — лишние запросы к базе, отключённый кеш, переписанный шаблон и тот же медленный экран. После нескольких изменений команда уже не знает, что именно помогло или что безопасно вернуть.
\nНачинайте с наблюдаемого факта. Запишите маршрут, вариант входа, компонент, шаблон и условие, при котором HTML меняется. Если часть сведений неизвестна, оставьте её неизвестной. Это лучше, чем заменить пробел догадкой. Производительность страницы нельзя объяснить одним слоем: запрос, компонент, кеш и рендеринг связаны, но проверяются отдельно.
\nОдна правка должна отвечать на один вопрос. Например: «входит ли группа пользователя в зависимость кеша этого компонента?» Это проверяемый вопрос. «Почему Bitrix медленный?» — нет. Пока вопрос не ограничен, нельзя выбрать ни инструмент, ни безопасное действие.
\nРазделите страницу на четыре границы. Маршрут задаёт вход. Компонент принимает параметры и получает данные. Кеш решает, нужно ли снова выполнять вычисление и сохраняет ли результат. Шаблон превращает результат компонента в HTML. Большой HTML не доказывает медленный SQL. Наличие кеша в настройках не доказывает cache hit на нужном запросе. Видимый шаблон не доказывает, что он стал причиной задержки.
\n| Симптом | Возможная причина | Проверка | Действие |
|---|---|---|---|
| Один и тот же каталог долго формирует ответ | Дорогая ветка компонента или промах кеша | Повторить тот же URL и записать компонент, параметры и режим кеша | Получить один разрешённый серверный или прикладной артефакт, не меняя TTL |
| Разные пользователи видят разный HTML | Группа, право или сегмент не вошли в ключ | Сверить все условия output с additionalCacheID и параметрами | Добавить зависимость или остановить изменение до уточнения контракта |
| После очистки кеша первый запрос снова тяжёлый | Очистка убрала результат, но не устранила стоимость построения | Сравнить холодный и повторный вход на одном маршруте | Искать стоимость формирования, а не считать очистку исправлением |
| Кеш работает, но HTML всё ещё избыточен | В результат попадают лишние данные | Проверить, нужен ли компоненту полный arResult и вызван ли SetResultCacheKeys | Сократить сохраняемые данные только после проверки шаблона |
| После изменения исчезают данные для части посетителей | Нарушена зависимость результата или изменён шаблон | Повторить исходный вход и сравнить HTML и условия доступа | Вернуть один diff и разобрать недостающий input |
Встроенное кеширование Bitrix начинается с StartResultCache. При действующем кеше метод возвращает false и отдаёт сохранённый результат. При недействующем кеше он возвращает true, после чего компонент получает данные и подключает шаблон. По документации базовая зависимость включает сайт, имя компонента, имя шаблона и входные параметры $arParams. Дополнительное условие передают отдельно.
Это контракт, а не измерение скорости. Он говорит, от чего должен зависеть результат, но не сообщает, сколько заняло выполнение запроса и был ли конкретный запрос cache hit. Если HTML зависит от группы пользователя, права доступа, языка или другого значения, такого условия нельзя оставлять только в PHP-ветке. Оно должно участвовать в зависимости результата. Иначе один сохранённый HTML может попасть к другому варианту посетителя.
\nSetResultCacheKeys решает другую задачу. Метод задаёт поля $arResult, которые нужно сохранить для использования после чтения кеша. Если его не вызвать внутри участка с StartResultCache, ядро может сериализовать весь результат. Лишние данные увеличивают размер кеша, но сам факт большого кеша ещё не доказывает, что он является главным узким местом страницы.
Ниже показана сокращённая схема, а не готовый код для конкретного проекта. Число инфоблока, параметры и поле группы вы должны заменить фактическими значениями. Пример нужен, чтобы увидеть место проверки зависимости и отрицательный путь. Он не сообщает production-результаты и не измеряет время.
\nif ($this->StartResultCache(false, [$USER->GetGroups(), $arParams['LANGUAGE_ID']])) {\n $this->arResult = loadCatalogItems($arParams['IBLOCK_ID']);\n\n if (!$this->arResult) {\n $this->AbortResultCache();\n return;\n }\n\n $this->SetResultCacheKeys(['SECTION_ID', 'ITEM_COUNT']);\n $this->IncludeComponentTemplate();\n}\nВ этом учебном варианте группа пользователя и язык входят в дополнительную зависимость, потому что они могут менять результат. Пустой результат останавливает кеширование через AbortResultCache: иначе отрицательный или неполный ответ может сохраниться как обычный. Нельзя переносить этот список в проект без проверки. Если HTML зависит от другой переменной, её нужно назвать и проверить отдельно.
Обратный путь так же важен, как успешный. Если вы не знаете, меняет ли условие HTML, не увеличивайте срок кеша и не выключайте кеш полностью. Сначала найдите владельца компонента, прочитайте параметры и определите output contract. Если разрешённого артефакта нет, корректное действие — остановить оптимизацию и зафиксировать недостающий факт.
\nStartResultCache. Не называйте кеш рабочим только потому, что в параметрах стоит ненулевой CACHE_TIME.Очистка всего кеша меняет состояние системы, но не объясняет стоимость формирования. После очистки первый запрос закономерно может быть тяжёлым. Выключение кеша убирает один путь и добавляет нагрузку на базу и PHP. Это не диагностика. Увеличение CACHE_TIME может уменьшить число построений, но закрепит неверный HTML, если ключ неполон.
Переписывать шаблон только потому, что он виден в каталоге файлов, тоже рискованно. Шаблон отвечает за вывод, но не обязан отвечать за дорогой запрос. Сначала проверьте, что компонент уже получил данные и сколько данных он сохраняет. И наоборот: уменьшение arResult не исправит медленный SQL, если запрос выполняется до формирования результата.
Не смешивайте в одной правке кеш, SQL, PHP и браузер. Иначе положительный результат нельзя связать с одним изменением. Если гипотеза не подтверждается, верните именно этот diff и повторите исходный вход. Откат всей страницы или массовая очистка кеша уничтожают полезный контекст.
\nДокументация Bitrix описывает API кеширования, но не знает самописный компонент, версию PHP, структуру базы, настройки окружения и реальные условия пользователя. Учебный код не заменяет профиль. Названия IBLOCK_ID, LANGUAGE_ID и группы в примере не являются данными конкретного сайта. Статья также не утверждает, что любая Bitrix-страница станет быстрее после добавления кеша.
Диагностика готова, когда выполнены все четыре условия: выбран один воспроизводимый маршрут; назван компонент и его шаблон; перечислены входы, которые меняют результат и кеш; сохранён артефакт до и после одного обратимого изменения. Действие считается успешным только при повторном замере того же входа и при отсутствии нового нарушения содержимого или доступа. Если хотя бы одного условия нет, готов не результат, а следующий вопрос.
\ntrue/false, базовые зависимости кеша и параметр дополнительных условий.$arResult, сохраняемых при встроенном кешировании компонентов.