Профилирование PHP с XHprof
Профилирование приложения – это сбор данных о скорости выполнения различных участков программы (файлов и функций). Существует множество инструментов профилирования PHP, но не все инструменты подходят для проведения анализа прямо в продакшне.
XHProf – мега простой профайлер, который собирает статистику прямо во время работы приложения почти без оверхеда.
Зачем профилировать?
Если приложение начинает работать медленно, профилирование поможет узнать, какая именно часть тупит. Результат профилирования – это обычно список выполненных функций и времени их исполнения.
Профилирование стоит делать до любой оптимизации приложения. В противном случае – будете руководствоваться догадками. Скорее всего неправильными.
Проблема Xdebug
Xdebug – мощное решение для PHP. Но сама платформа Xdebug настолько тяжелая, что ее нельзя использовать на [p204 работающих сайтах]. XDebug создает значительную нагрузку на ресурсы сервера и замедляет приложение.
С другой стороны, проблемы на “живом” сайте могут быть совершенно не такими, как в среде разработчика. Профилирование только на компьютерах разработчиков будет показывать лишь часть проблем.
Именно поэтому и было разработано решение XHprof. Оно предназначено для применения в работающих приложениях. Основная идея этого профайлера – создавать минимум нагрузки на приложение при этом собирать все необходимые данные о скорости работы. Решение разработано ребятами из Facebook и [https://github.com/RustJason/xhprof/tree/php7 поддерживается новыми версиями PHP].
XHProf
Установка
На Debian XHprof есть в sid пакетах, поэтому:
apt-get install xhprof
Вы также можете [p203 собрать XHprof] самостоятельно.
Включение профилирования
Пусть у нас есть скрипт с таким кодом:
function execute()
{
# Какой-то PHP код
}
**execute();**
Проведем профилирование с помощью XHprof. Для этого на этой странице необходимо:
- Включить профайлер в самом начале.
- В самом конце программы остановить профайлер и сохранить полученные данные.
Это будет выглядеть так:
function execute()
{
# Какой-то PHP код
}
# Инициализируем профайлер
**xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);**
# Выполняем программу после включения профайлера
execute();
# Останавливаем профайлер после выполнения программы
**$xhprof_data = xhprof_disable();**
## Сохраняем результат профилирования в переменную $xhprof_data
- Функция xhprof_enable() принимает в качестве аргументов флаги. XHPROF_FLAGS_CPU для фиксирования статистики процессора, XHPROF_FLAGS_MEMORY – для памяти, XHPROF_FLAGS_NO_BUILTINS – для игнорирования встроенных функций.
- xhprof_disable() выключит профайлер и вернет собранную статистику.
Отчеты
Генерация
Собранные данные можно проанализировать в интерфейсе XHprof для построения отчетов. Для этого, необходимо скачать исходники XHprof:
cd /var/www; wget http://pecl.php.net/get/xhprof-0.9.4.tgz gzip -d xhprof-0.9.4.tgz tar -xvf xhprof-0.9.4.tar
После этого необходимо внести изменения в скрипт:
## Новый код сохраняет отчет для использования в графическом интерфейсе
Интерфейс для отчетов
Чтобы увидеть отчет, необходимо настроить виртуальный хост на папку /var/www/xhprof-0.9.4/xhprof_html. Например, в Nginx:
server {
server_name xh.ruhighload.com;
root /var/www/xhprof-0.9.4/xhprof_html;
index index.php;
location ~* .(php)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
nginx -s reload
После этого появится список отчетов:
Таблица содержит список функций, которые были выполнены в рамках одной страницы с дополнительной информацией:
- Calls – количество и процентное соотношение вызовов функции.
- Incl. Wall Time – время выполнения функции с вложенными функциями.
- Excl. Wall Time – время выполнения функции без вложенных функций.
- Incl. CPU – процессорное время с вложенными функциями.
- Excl. CPU – процессорное время без вложенных функций.
- Incl. MemUse – потребление памяти с вложенными функциями.
- Excl. MemUse – потребление памяти без вложенных функций.
- Incl. PeakMemUse – максимальное потребление памяти с вложенными функциями.
- Excl. PeakMemUse – максимальное потребление памяти без вложенных функций.
Графические отчеты
Чтобы построить графический отчет, убедитесь, что у Вас установлен graphviz:
apt-get install graphviz
После этого по ссылке [View Full Callgraph] будет доступна иерархия вызовов нашей страницы:
Ресурсоемкие участки кода выделены желтым (средние) и красным (самые тяжелые). Это те участки кода, которые используют множество ресурсов относительно всей остальной программы. Это может быть одна медленная функция или большое количество вызовов быстрой функции. В нашем примере функция str_replace() помечена красным из-за 262 вызовов.
Агрегатные отчеты
Интерфейс XHprof также позволяет просматривать агрегатную информацию сразу с нескольких отчетов. Для этого run_id передаются через запятую:
http://xh.ruhighload.com/index.php?run=**53a894f6d5d9b,53a894fcf126e**&source=test
<h2>TL;DR
Используйте XHprof для профилирования PHP прямо в продакшне.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: