Профилирование 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. Для этого на этой странице необходимо:

  1. Включить профайлер в самом начале.
  2. В самом конце программы остановить профайлер и сохранить полученные данные.

Это будет выглядеть так:


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 прямо в продакшне.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023