[Пост] Профилирование с XHProf и PHP 7.2
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.
Или же выбрать конретный отчет http://xhprof.server_name.dev/?run=5c371640d56db&source=test&all=1
Интерфейс 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
.