Post main image

XHProf — профилировщик PHP-приложений, который собирает статистику прямо во время их работы.

Установка на примере PHP 7.2 и Nginx

Вытягиваем недалеко от корня проекта исходники профайлера, после чего устанавливаем расширение:

git clone https://github.com/longxinH/xhprof.git
cd xhprof/extension
phpize
./configure --with-php-config=/usr/bin/php-config7.2
make
make install
printf "extension=xhprof.so\nxhprof.output_dir=/var/log/xhprof" > /etc/php/7.2/mods-available/xhprof.ini
ln -s /etc/php/7.2/mods-available/xhprof.ini /etc/php/7.2/cli/conf.d/20-xhprof.ini
ln -s /etc/php/7.2/mods-available/xhprof.ini /etc/php/7.2/fpm/conf.d/20-xhprof.ini
service php7.2-fpm reload

Проверяем, что xhprof подключился:

root@b155b8080a2b:/var/www/xhprof/extension# php -i | grep xhprof
/etc/php/7.2/cli/conf.d/20-xhprof.ini,
xhprof
xhprof support => enabled
xhprof.output_dir => /var/log/xhprof => /var/log/xhprof
xhprof.sampling_depth => 0x7fffffff => 0x7fffffff
xhprof.sampling_interval => 100000 => 100000
PWD => /var/www/xhprof/extension
OLDPWD => /var/www/xhprof
$_SERVER['PWD'] => /var/www/xhprof/extension
$_SERVER['OLDPWD'] => /var/www/xhprof

Добавляем конфигурацию сервера для чтения отчетов:

server {
    listen 80;
    server_name xhprof.server_name.dev;
    root /var/www/xhprof/xhprof_html;

    index index.php;

    location ~* \.(php)$ {
            fastcgi_pass unix:/run/php/php7.2-fpm.sock;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
 }

Перезагружаем конфиги nginx service nginx reload.

Использование

Создадим некоторый скрипт test-xhprof.php:

<?php

xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

foreach (range(1, 1000) as $int) {
    $int * 2;
}

$xhprof_data = xhprof_disable();

include_once __DIR__.'/../xhprof/xhprof_lib/utils/xhprof_lib.php';
include_once __DIR__.'/../xhprof/xhprof_lib/utils/xhprof_runs.php';

$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, 'test');

echo "RUN ID: $run_id";

Функция xhprof_enable() принимает в качестве аргументов флаги:

  • XHPROF_FLAGS_CPU для фиксирования статистики процессора
  • XHPROF_FLAGS_MEMORY — для памяти
  • XHPROF_FLAGS_NO_BUILTINS — для игнорирования встроенных функций Функция xhprof_disable() выключит профайлер и вернет собранную статистику.

Запустим его curl http://server_name.dev/test-xhprof.php, получаем ошибку вида Warning: fopen(/var/log/xhprof/5c371112b8a50.test.xhprof): failed to open stream: No such file or directory. Это говорит нам, что нет директории, куда сохранять отчеты, которую мы указали в конфиге xhprof.output_dir=/var/log/xhprof. Создадим её mkdir /var/log/xhprof и повторим запрос:

curl http://server_name.dev/test-xhprof.php
RUNID: 5c3715bd1655c

Теперь можно посмотреть список отчетов по адресу http://xhprof.server_name.dev.

Post main image

Или же выбрать конретный отчет http://xhprof.server_name.dev/?run=5c371640d56db&source=test&all=1

Post main image

Интерфейс XHprof также позволяет просматривать агрегатную информацию сразу с нескольких отчетов. Для этого run_id передаются через запятую http://xhprof.server_name.dev/index.php?run=53a894f6d5d9b,53a894fcf126e&source=test

Таблица содержит список функций, которые были выполнены в рамках одной страницы с дополнительной информацией:

  • Calls — количество и процентное соотношение вызовов функции.
  • Incl. Wall Time — время выполнения функции с вложенными функциями.
  • Excl. Wall Time — время выполнения функции без вложенных функций.
  • Incl. CPU — процессорное время с вложенными функциями.
  • Excl. CPU — процессорное время без вложенных функций.
  • Incl. MemUse — потребление памяти с вложенными функциями.
  • Excl. MemUse — потребление памяти без вложенных функций.
  • Incl. PeakMemUse — максимальное потребление памяти с вложенными функциями.
  • Excl. PeakMemUse — максимальное потребление памяти без вложенных функций.

Чтобы увидеть графические отчеты необходимо установить graphviz, например apt-get install graphviz.