Профилирование PHP с XHprof и Graphviz
Профилирование приложения - это процесс сбора информации о скорости выполнения различных участков кода.
XHprof - это простой профайлер от компании Facebook, который можно использовать в продакшене практически без замедления его работы.
Для чего нужно профилирование?
Профилирование помогает понять истинную причину почему тормозит приложение и перестать заниматься гаданием. А с помощью Graphviz поиск становится еще проще, на диаграмме будут выделены красным критические моменты и желтым места, которые стоит оптимизировать.
Процесс установки XHprof и Graphviz на Ubuntu 19.04.
Скачиваем XHprof с git-репозитория: https://github.com/phacility/xhprof. Для установки расширения xhprof для php, должен быть установлен пакет php-dev. Далее выполняем следующие команды:
cd ./xhprof/extension
phpize ./
./configure
make
make test
sudo make install
sudo touch /etc/php/7.2/mods-available/xhprof.ini
содержимое xhprof.ini
extension=xhprof.so
xhprof.output_dir=/tmp
далее
sudo phpenmod xhprof
проверяем, что расширение xhprof установлено
php -m | grep xhprof
если все хорошо, то команда выведет xhprof
Установка graphviz
sudo apt install graphviz
Для построения отчетов можно использовать веб-интерфейс, который есть внутри репозитория xhprof в директории xhprof_html. Пример настройки веб-интерфейса для apache2.
Должна быть создана директория в /var/www/xhprof, где находится код, скачанный с репозитория https://github.com/phacility/xhprof.
sudo touch /etc/apache2/sites-available/xhprof.local.conf
содержимое xhprof.local.conf
<VirtualHost *:80>
ServerName xhprof.local
ServerAlias www.xhprof.local
DocumentRoot /var/www/xhprof/xhprof_html/
<Directory /var/www/xhprof/xhprof_html/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
Далее выполняем
sudo a2ensite xhprof.local
sudo service apache2 reload
Также необходимо добавить в файл /etc/hosts, следующую запись
127.0.0.1 xhprof.local
После этого при переходе по http://xhprof.local/ откроется веб-интерфейс для просмотра отчетов xhprof.
Пример использования XHprof.
<?
function test()
{
// Какой-то код
}
// Инициализация профайлера
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
// Выполнение функции
test();
// Получение данных профайлера
$xhprof_data = xhprof_disable();
// Сохранение данных в файл
file_put_contents(“/tmp/report.txt”, serialize($xhprof_data));
Для формирования отчета из этих данных, можно использовать следующий код:
<?php
include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_lib.php";
include_once "/var/www/xhprof/xhprof_lib/utils/xhprof_runs.php";
if (!isset($argv[1])) {
throw new Exception('Не передано название');
}
$xhprof_data = file_get_contents('/tmp/report.txt');
if ($xhprof_data) {
$xhprof_data = unserialize($xhprof_data);
}
$xhprof_runs = new XHProfRuns_Default('/tmp');
$run_id = $xhprof_runs->save_run($xhprof_data, $argv[1]);
После формирования отчета с помощью этого кода перейдите в веб-интерфейс по http://xhprof.local. На Рисунке 1 показан скриншот страницы, на которой будет ссылка на отчет.
Рисунок 1. Список отчетов
При нажатии на ссылку открывается страница с отчетом (Рисунок 2), на которой представлены различные метрики выполнения кода по функциям.
Рисунок 2. Отображение отчета
При нажатии на ссылку для просмотра графика Graphviz (Рисунок 3) сразу видна общая картина выполнения кода.
Рисунок 3. График Graphviz
Вывод
XHprof дает множество метрик, по которым можно быстро определить в каком участке кода необходимо выполнить оптимизацию. Этот инструмент экономит большое количество времени и сил при анализе производительности и поиске мест в коде которые следует улучшить.