вторник, 30 июля 2013 г.

Xhprof на Ubuntu 10.04

Возникла необходимость поднять профайлинг для проекта на локальном серевере под Ubuntu 10.04
Выбор само собой пал на Xhprof. Конечной целью было получение графическое отображения графа вызовов функций.

Что было сделано для этого?

Установка xhprof

Установка ведется через pecl. На момент написания статьи версия xhprof была 0.9.3.
pecl install xhprof-0.9.3
Затем, в php.ini прописываем наше расширение и путь для хранилища результатов:
[xhprof]
extension=xhprof.so
xhprof.output_dir=/usr/local/xhprof/out
Путь необходимо будет создать и навешать соотв. права.

Пользовательский интерфейс 

Доступ к данным будем получать через web-интерфейс. Для этого настроим локальный хост. Пусть будет xhprof.lan
Сперва скачаем сырцы и распакуем в директорию с файлами нашего хоста.
Затем опишем хост. Пример для Nginx:
server {
    listen 80;
    server_name xhprof.lan;
    charset utf8;
    root /var/www/xhprof.lan/xhprof-0.9.3/xhprof_html;
    index index.php;

    location ~ \.php$ {
        fastcgi_pass    unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
Секция location может варьироваться в зависисмости от настроек вашего php5-fpm.
Так же пропишем в /etc/hosts наш хост.

Визуализация

Для визуализации нам понадобится утилита Graphviz:
apt-get install graphviz

Пример работы

Итак, все установлено и настроено. Как теперь с этим жить работать? Приведу пример использования.
В начале приложения пишем что-нибудь подобное:
if (PROFILING_ON){
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
    $profilingClose = function(){
        $xhprof_data = xhprof_disable();
        include_once "xhprof_lib/utils/xhprof_lib.php";
        include_once "xhprof_lib/utils/xhprof_runs.php";
        $xhprof_runs = new XHProfRuns_Default();
        $run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_testproject");

    };
}
И в конце приложения:
if (PROFILING_ON){
    \call_user_func($profilingClose, array());
}
Потом запускаем наше приложение. После чего идем на новосозданный хост xhprof.lan и выбираем из списка сгенерированной статистики нужную.