TGViewer
Виктор Прогает в Сербии Виктор Прогает в Сербии @viktorprogger_channel_ru · 115 subscribers
Post #94 178
Профайлинг с XHProf | #development #php #profiling #xhprof

Некоторое время назад я сравнивал различные профайлеры: надо посмотреть, что сколько времени кушает именно на проде. Остановился на XHProf по нескольким причинам: это бесплатное self hosted решение, сервер не нагружает, можно профайлить один отдельный реквест.

А вот с использованием его в работе возникла сложность: я не смог найти подробного гайда. Поэтому напишу его здесь 😊 Благо, он короткий совсем.

1. Установка: pecl install xhprof
2. Конфигурация. Надо добавить файлик конфигурации вроде /usr/local/etc/php/conf.d/xhprof.ini php с двумя строками:
extension=xhprof.so
xhprof.output_dir="/foo/bar"

Папка /foo/bar должна существовать. Именно туда будут складываться профайлы. Больше никаких настроек нет в принципе.
3. Сбор данных. В отличие от xDebug и других профайлеров, с XHProf надо обязательно писать код в приложении. Это и минус, и дополнительная гибкость одновременно. Кода нужно 2 части: старт профайлинга и конец. В конец мы еще и название профайла пишем. В моем случае это была генерация PDF. К слову: эта строка пойдет в название файла всех собранных профайлов, так что пробелы и слэши лучше не писать.
Другой неожиданный момент - что функции и классы этой библиотеки не подгружаются автоматически, и их надо включить в код include'ом. Итак, сами блоки:
// Начинаем сбор данных
if (extension_loaded('xhprof')) { // Именно здесь можно добавить условие для запуска профайлинга: например, наличие GET-параметра.
include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_lib.php';
include_once '/usr/local/lib/php/xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
}


if (extension_loaded('xhprof')) { // Здесь условие старта профайлинга нужно повторить
(new \XHProfRuns_Default())->save_run(xhprof_disable(), 'pdf-generation'); // Последний параметр - название профайла
}


Здесь функци xhprof_enable() и xhprof_disable() (или их лайт версии xhprof_sample_enable и xhprof_sample_disable) начинают и заканчивают профилирование. Вторая при этом возвращает собранные данные. А вот класс XHProfRuns_Default умеет эти данные сохранять.
4. Самое интересное: анализ данных. В этом мне помог Buggregator. Вернее, его тулза Trap. В релизной версии работы с XHProf еще нет, но можно попробовать на ветке files-observer. Я подготовил репозиторий с контейнером, в котором все отлично работает: достаточно запустить докер композ, да закинуть в папку ваши профайлы.
Если возникнут вопросы по поводу баггрегатора или будут какие-то проблемы - ребята всегда рады помочь в своем дискорде.
GitHub GitHub - viktorprogger/buggregator-trap-xhprof Contribute to viktorprogger/buggregator-trap-xhprof development by creating an account on GitHub.
  • 👍 5
  • 🔥 2
More from @viktorprogger_channel_ru
  1. Oct 7, 2026У Yii3 снова поднялся вопрос шедулера: мол, будет ли такой пакет? У Yii2 такой был, у Лары…
  2. Sep 16, 2026Вам интересны LLM? У меня уже есть некоторый опыт в работе с ними: ▫️ Использование в алго…
  3. Sep 15, 2026По уже сложившемуся распределению видно, что я жестоко ошибался ☺️ Каюсь, и впредь буду де…
  4. Sep 15, 2026Post #384
  5. Sep 14, 2026Быстрый файловый обмен WSL ↔️ Windows Вчера Леонид @nex_otaku принес благую весть: он сдел…
  6. Sep 10, 2026Немного нелепого вам в ленту
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →