Профилирование 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 дает множество метрик, по которым можно быстро определить в каком участке кода необходимо выполнить оптимизацию. Этот инструмент экономит большое количество времени и сил при анализе производительности и поиске мест в коде которые следует улучшить.