Профилирование PHP – кода. XHprof – иерархический профайлер c html-интерфейсом
Что такое профилирование?
Профилирование – это процесс анализа работы приложения для сбора информации о производительности (сбор набора характеристик – время, использование оперативной памяти и ресурсов процессора, количество вызовов функций и так далее). Соответственно инструмент, который используется для этого, называется профайлером.
Профайлеры в большинстве случаев используют чтобы найти в приложении хот-спот («горячее место», то есть участок кода, время исполнения которого неоправданно длительное), а так же для анализа и оценки качества приложения.
Профилирование PHP –кода
Наиболее известными PHP-профайлерами являются:
Xdebug's Profiler (http://www.xdebug.org/docs/profiler) и XHprof (http://pecl.php.net/package/xhprof). О втором и пойдет речь.
O XHprof
XHprof – это иерархический профайлер для PHP c HTML интерфейсом. Ядро написано на языке С (на уровне отчетов и интерфейса код уже весь на PHP), а для скачки доступно в виде екстеншина для PHP. Этот профайлер умеет собирать данные об использовании памяти, ресурсов процессора, количестве и последовательности вызовов функций, а также inclusive time (время, потраченное на функцию и на все функции, вызванные из нее) и exclusive time(время, потраченное на функцию без учета времени на вложенные функции).
Дополнительно, XHprof поддерживает сравнение двух запусков (иерархический DIFF отчет) и умеет объединять несколько запусков для усреднения данных.
Установка XHprof
С 1 июня 2009 года (версия 0.9.2, начиная с PHP 5.2.0) XHprof предоставляется как PECL-пакет. Между прочим, для Windows не доступен.
Процесс установки:
pecl download xhprof-0.9.2 tar -xvf xhprof-0.9.2.tar.gz cd xhprof-0.9.2/extension phpize ./configure make make install
Далее нужно подключить модуль в php.ini:
extension=xhprof.so xhprof.output_dir=/var/log/xhprof;
Настройка интерфейса отчетов
Модуль XHprof имеет возможность построение текстовых и графических отчетов.
В установочной директории xhprof-0.9.2 есть две папки xhprof_html (доступ к UI и GUI) и xhprof_lib (библиотека для анализа данных).
Вторую папку в зависимости от ОС нужно разместить в /usr/local/share/php/ или /usr/local/lib/php/ (обеспечивая этим глобальный доступ к библиотеке).
Дальше нужно сделать доступ к UI. Для этого на сервере нужно создать новый домен или сабдомен и разместить в него папку xhprof_html (как вариант сюда можно разместить и xhprof_lib).
Запуск и использование профайлера, основные функции
Для запуска профайлера:
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
Здесь XHPROF_FLAGS_CPU и XHPROF_FLAGS_MEMORY указывают профайлеру, что нужно собирать данные и об использовании процессора и об оперативной памяти.
Остановка работы профайлера:
$xhprof_data = xhprof_disable();
Сохранение данных:
include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_lib.php'; include_once dirname(__FILE__) . '/xhprof_lib/utils/xhprof_runs.php'; $namespace = $_SERVER['SERVER_NAME']; $xhprof_runs = new XHProfRuns_Default(); $run_id = $xhprof_runs->save_run($xhprof_data, $namespace);
Генерируем ссылку для просмотра отчетов:
print sprintf('http://<xhprof_domain>/xhprof_html/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
Графический интерфейс
XHprof имеет в себе, также, встроенный графический интерфейс.
Особой ценности, как по мне, он не предоставляет, но не вспомнит о нем в этой статье не имею права :)
Для его работы нужно чтобы на сервере было установлено приложение Graphviz (входит в большинство дистрибутивов Linux’a). После настройки html интерфейса Вы уже можете использовать и графический без каких либо других движений (ссылка [View Full Callgraph] в отчетах).
При первом использовании очень часто стыкаются с следующей ошибкой:
Warning: proc_open() [function.proc-open]: open_basedir restriction in effect. File(/dev/null) is not within the allowed path(s)
Это значит, что у пользователя, от имени которого выполняется скрипт, нет доступа к нулл девайсу (/dev/null). Варианта два: разрешить такой доступ с помощью свойства open_basedir в php.ini или изменить строчку 108 файла /xhprof_lib/utils/callgraph_utils.php заменив "/dev/null" на любое значение, к которому наш скрипт будет иметь доступ (я, например, для тестинга заменял на "/tmp/xhprof_stderr").
Профилирование «живых» приложений
Понятное дело что профилирование в тестовой среде может очень сильно отличаться от того, что мы имеем на живом сайте.
Поэтому, не могу не упомянуть ещё один немаловажный фактор о XHprof: этот модуль создавался именно для работы с живыми приложениями. И он имеет нативную реализацию, что уже подразумевает отличную производительность.
То есть его можно смело использовать на живых проектах. Например, можно сделать запуск только раз в сто запросов к серверу:
if (rand(1, 100) == 1) { xhprof_enable(XHPROF_FLAGS_MEMORY); $xhprof_enable = TRUE; } // исполнение приложение if ($xhprof_enable) { $xhprof_data = xhprof_disable(); // сохраняем данные }
Так же профайлер имеет в себе встроенный режим «Легких сэмплов» («Lightweight Sampling»), после включения которого профилирование будет осуществляться в течении малых промежутков времени (100 миллисекунд). Для подключение нужно просто заменить функции старта/остановки профайлера на следующие: xhprof_sample_enable (вместо xhprof_enable), xhprof_sample_disable (вместо xhprof_disable) .
Дополнительная информация
Наиболее обширную информация о профайлере можно найти на страничке разработчиков (между прочем, это не кто там а сам FaceBook Inc):
http://mirror.facebook.com/facebook/xhprof/doc.html