Профилирование приложения — это сбор данных о скорости выполнения различных участков программы (файлов и функций). Существует множество инструментов профилирования PHP, но не все инструменты подходят для проведения анализа прямо в продакшне.
XHProf — мега простой профайлер, который собирает статистику прямо во время работы приложения почти без оверхеда.
Зачем профилировать?
Если приложение начинает работать медленно, профилирование поможет узнать, какая именно часть тупит. Результат профилирования — это обычно список выполненных функций и времени их исполнения.
Профилирование стоит делать до любой оптимизации приложения. В противном случае — будете руководствоваться догадками. Скорее всего неправильными.
Проблема Xdebug
Xdebug — мощное решение для PHP. Но сама платформа Xdebug настолько тяжелая, что ее нельзя использовать на работающих сайтах. XDebug создает значительную нагрузку на ресурсы сервера и замедляет приложение.
С другой стороны, проблемы на "живом" сайте могут быть совершенно не такими, как в среде разработчика. Профилирование только на компьютерах разработчиков будет показывать лишь часть проблем.
Именно поэтому и было разработано решение XHprof. Оно предназначено для применения в работающих приложениях. Основная идея этого профайлера — создавать минимум нагрузки на приложение при этом собирать все необходимые данные о скорости работы. Решение разработано ребятами из Facebook и поддерживается новыми версиями PHP.
XHProf
Установка
На Debian XHprof есть в sid пакетах, поэтому:
apt-get install xhprof
Вы также можете собрать 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
После этого необходимо внести изменения в скрипт:
<?
...
$xhprof_data = xhprof_disable();
include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_lib.php";
include_once "/var/www/xhprof-0.9.4/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "test");
# Новый код сохраняет отчет для использования в графическом интерфейсе
Интерфейс для отчетов
Чтобы увидеть отчет, необходимо настроить виртуальный хост на папку /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
TL;DR
Используйте XHprof для профилирования PHP прямо в продакшне.