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

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

Что такое прокси-сервер: пояснение простыми словами, зачем нужны прокси

Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…

21.11.2024

Что такое PWA приложение? Зачем необходимо прогрессивное веб-приложение

Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…

19.11.2024

Как создать игру на телефоне: программирование с помощью конструктора

Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…

17.11.2024

Google Bard: эффективный аналог ChatGPT

В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…

14.11.2024

Скрипт и программирование: что это такое простыми словами

Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…

12.11.2024

Дедлайн в разработке: что это такое простыми словами

Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…

11.11.2024