Некоторое время назад я сравнивал различные профайлеры: надо посмотреть, что сколько времени кушает именно на проде. Остановился на XHProf по нескольким причинам: это бесплатное self hosted решение, сервер не нагружает, можно профайлить один отдельный реквест.
А вот с использованием его в работе возникла сложность: я не смог найти подробного гайда. Поэтому напишу его здесь 😊 Благо, он короткий совсем.
1. Установка:
pecl install xhprof2. Конфигурация. Надо добавить файлик конфигурации вроде
/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. Я подготовил репозиторий с контейнером, в котором все отлично работает: достаточно запустить докер композ, да закинуть в папку ваши профайлы.Если возникнут вопросы по поводу баггрегатора или будут какие-то проблемы - ребята всегда рады помочь в своем дискорде.