Профілювання PHP-коду 1С-Бітрікс (Xdebug, Blackfire)
Ми часто стикаємося з ситуацією: сайт на Бітрікс завантажується 4–6 секунд, хоча nginx і MySQL в порядку. PHP витрачає левову частку часу на незрозумілі операції. Без профілювальника — ворожіння. З профілювальником — точні цифри: яка функція, скільки разів викликана, скільки часу зайняла. Розбираємо два робочих інструменти — Xdebug і Blackfire — і показуємо, як за їх допомогою знайти та усунути вузькі місця. На основі нашого досвіду (10+ років, 500+ проєктів) гарантуємо прозорий результат. Економія бюджету на розробку після оптимізації може бути значною та залежить від складності.
Чому профілювання критичне для Бітрікс?
У складних каталогах із тисячами інфоблоків і компонентів продуктивність падає непомітно. Одна сторінка може викликати CIBlockElement::GetList() 40 разів без кешу. Або агент кожні 5 хвилин перераховує кошики. Без профілювальника такі проблеми шукаються годинами. З профілювальником — 10 хвилин на замір і одразу зрозуміло, куди дивитися. Економія часу розробника — до 70%.
Xdebug: профілювання через cachegrind
Xdebug — розширення PHP, яке записує трасування у форматі cachegrind. Файл відкривається в KCachegrind або QCacheGrind. Установка та конфігурація:
pecl install xdebug # або apt-get install php8.2-xdebug # php.ini або 99-xdebug.ini [xdebug] zend_extension=xdebug.so xdebug.mode=profile xdebug.output_dir=/tmp/xdebug xdebug.profiler_output_name=callgrind.out.%p.%r xdebug.start_with_request=trigger start_with_request=trigger — профілювання тільки за GET-параметром ?XDEBUG_PROFILE=1 або cookie. Не вмикайте always на бойовому — overhead 10–20x. Згідно з документацією Xdebug, режим профілювання призначений для розробки, а не для бойових серверів (xdebug.org/docs/profiler).
Запит із профілюванням:
curl "https://site.ru/catalog/product/?XDEBUG_PROFILE=1" -o /dev/null У /tmp/xdebug з'явиться файл callgrind.out.*. Відкриваєте в KCachegrind — дерево викликів і відсоток часу кожної функції.
Що шукати в профілі Бітрікс
Типові вузькі місця, які видно в cachegrind:
-
CIBlockElement::GetList()— викликається десятки разів без кешу. Сумарний час >30% — проблема в кешуванні компонентів. -
CSQLWhere::GetQuery()— складні фільтри без індексів. -
CBitrixComponent::includeComponent()— вкладені 20+ компонентів накопичують overhead. -
CUser::IsAuthorized()— не кешується між викликами. -
\Bitrix\Main\ORM\Query\Query::exec()—fetchAll()на великих вибірках без ліміту.
Який інструмент обрати: Xdebug чи Blackfire?
| Критерій | Xdebug cachegrind | Blackfire |
|---|---|---|
| Накладні витрати | ~10–20x уповільнення | ~2x |
| Зручність аналізу | KCachegrind (десктоп) | Веб-інтерфейс, граф |
| Порівняння профілів | Вручну | Вбудований diff |
| CLI-скрипти | Так | Так |
| Production | Ні | Так (з обережністю) |
| Вартість | Безкоштовно | Freemium |
Blackfire для production працює в 5–10 разів швидше, ніж Xdebug, і підходить для безперервного профілювання. Xdebug краще для глибокого аналізу на dev-сервері.
Blackfire: профілювання з агрегацією
Blackfire — SaaS-рішення. Агент на сервері, PHP-розширення перехоплює виконання, дані на blackfire.io. Установка та конфігурація:
wget -O - https://packages.blackfire.io/gpg.key | apt-key add - echo "deb http://packages.blackfire.io/debian any main" > /etc/apt/sources.list.d/blackfire.list apt-get update && apt-get install blackfire blackfire-php # php.ini extension=blackfire.so blackfire.agent_socket=tcp://127.0.0.1:8307 # Авторизація blackfire agent:config --server-id=XXXX --server-token=YYYY blackfire agent:start Запуск профілювання:
# CLI blackfire run php artisan bitrix:some-command # Через curl blackfire curl https://site.ru/catalog/ # Через браузерне розширення Blackfire — кнопка Profile на сторінці. Практичний алгоритм оптимізації
Покроковий план
1. Базовий замір. Профілюємо сторінку, фіксуємо топ-5 функцій за часом. 2. Аналіз кореня. Дивимося call stack — хто викликає дорогу функцію і скільки разів. Наприклад, `GetList` може бути викликаний 40 разів через цикл у компоненті. 3. Кешування. Вмикаємо кеш компонента (`CACHE_TYPE=A`, `CACHE_TIME=3600`) або кешуємо результат вручну через `\Bitrix\Main\Data\Cache`. 4. Повторний замір. Порівнюємо з baseline. 5. Оптимізація запитів. Прибираємо зайві поля в `$select`, додаємо індекси, переписуємо з `GetList` на D7 ORM.Чому профілювання потрібно проводити на dev-сервері?
Xdebug додає значну затримку (10–20x), тому його використання на бойовому сервері неприйнятне. Навіть Blackfire з низьким overhead може впливати на реальних користувачів. Dev-сервер з копією даних дає точні заміри без ризику для бізнесу. Якщо бойовий сервер недоступний для профілювання, ми налаштовуємо стейджинг із синхронізацією даних. Зв'яжіться з нами для уточнення деталей налаштування оточення.
Як читати cachegrind-профіль?
KCachegrind показує дерево викликів, де кожен вузол — функція з часом виконання (self vs inclusive). Шукайте функції, у яких inclusive time перевищує 10% від загального часу. Для Бітрікс часто це CIBlockElement::GetList, CSQLWhere::GetQuery і CUser::IsAuthorized. Увімкніть фільтр за модулем bitrix — він відсіче всі функції ядра PHP. Замовте профілювання та отримайте детальний розбір від наших інженерів.
Профілювання агентів і CLI
Для фонових агентів і CLI-скриптів використовуйте XDEBUG_MODE=profile або blackfire run. Приклад:
XDEBUG_MODE=profile php /path/to/script.php blackfire run php /path/to/script.php Це дозволяє виявити повільні агенти, які тягнуть продуктивність фону.
Що входить у роботу
- Налаштування Xdebug та/або Blackfire на dev-сервері або стейджингу.
- Профілювання 3–5 ключових сторінок/скриптів.
- Детальний звіт із графіками викликів і часом.
- Рекомендації щодо оптимізації (кешування, індекси, рефакторинг).
- Повторне профілювання після впровадження правок.
- Підсумкова документація та консультація команди.
Строки
| Задача | Строк |
|---|---|
| Налаштування профілювальника | 2–6 годин |
| Профілювання + звіт по одній сторінці | 2–4 години |
| Комплексний аудит 3–5 сторінок | 2–5 днів |
| Оптимізація вузьких місць | від 3 днів |
Вартість розраховується індивідуально залежно від обсягу. Ми гарантуємо прозорість — ви отримуєте не просто звіт, а виправлені вузькі місця та вимірювання приросту продуктивності. Зв'яжіться з нами для оцінки вашого проєкту — визначимо фронт робіт і запропонуємо план профілювання. Замовте профілювання та переконайтеся в ефективності.
Додаткові ресурси: Профілювання (програмування) та Xdebug. Згідно з документацією Xdebug, режим профілювання призначений для розробки.







