Профилирование PHP-кода

    Профилирование PHP-кода

    Рано или поздно каждый из нас сталкивается с унаследованным кодом и его оптимизацией. Дебаггер и профилировшик в такой ситуации — лучшие помощники программиста. У тех кто работает с PHP, благодаря Дерику Ретансу (Derick Rethans) есть хороший инструмент — xDebug. Информации касательно xDebug много даже в рунете, поэтому речь в этой статье пойдет не о нем.

    Наткнувшись на упоминание о профилировщике для PHP я сразу подумал об xDebug ( о проприетарных инструментах от Zend я давно уже успел позабыть ), но на этот раз ошибся — речь пойдет об XHProf.
    XHProf

    Этот профилировшик был разработан специально для Facebook, а исходный код его был открыт в марте 2009 года.

    Установка прошла достаточно быстро и гладко.
    wget pecl.php.net/get/xhprof-0.9.2.tgz
    tar xvf xhprof-0.9.2.tgz
    cd xhprof-0.9.2/extension/
    phpize
    ./configure && make && make install
    cd /usr/local/etc/php.d/
    vim xhprof.ini
    cd /usr/local/
    vim header.php
    vim footer.php
    vim etc/php.ini
    /etc/init.d/php-fpm restart
    cp vhost.conf.template prof.my.conf
    sed -i s/site/prof/ prof.my.conf
    vim prof.my.conf
    /etc/init.d/nginx restart


    Разберем упомянутые конфиги

    xhprof.ini
    [xhprof]
    extension=/usr/local/lib/php/extensions/no-debug-non-zts-20090626/xhprof.so
    xhprof.output_dir="/home/max/www/profile/"


    в php.ini я добавил 2 строки, разовор о которых пойдет ниже
    auto_prepend_file = /usr/local/header.php
    auto_append_file = /usr/local/footer.php


    prof.my.conf — конфиг нгинкса — самый стандартный.

    server {
    listen 80;
    server_name prof.my;
    charset utf8;

    root /usr/local/src/xhprof-0.9.2/xhprof_html ;
    location / {
    index index.php;
    }

    location ~ \.php$ {
    fastcgi_pass 127.0.0.1:12000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
    include fastcgi_params;

    }
    }


    В /usr/local/src/xhprof-0.9.2/xhprof_html лежат PHP-исходники, создающие неплохой WEBGUI к профайлеру.

    Итак о двух главных файлах:

    header.php
    <?php
    if(isset($_COOKIE['xhprof'])){

    if (extension_loaded('xhprof')) {
    include_once '/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php';
    include_once '/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php';
    xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
    }
    }


    footer.php
    <?php
    if(isset($_COOKIE['xhprof'])){
    if (extension_loaded('xhprof')) {
    $profiler_namespace = 'myapp'; // namespace for your application
    $xhprof_data = xhprof_disable();
    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);

    // url to the XHProf UI libraries (change the host name and path)
    $profiler_url = sprintf('http://prof.my/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
    echo <<<OUT
    Profiler output
    OUT;
    }
    }


    Теперь запускаем любой PHP-скрипт через веб и видим в левом верхнем углу ссылку на вывод профилировщика — именно для этого и был создан хост prof.my

    Обратите внимание — я использую проверку на COOKIE! При такой проверке можно безопасно использовать профилировщик на production-сервере — на реальных данных и реальной загрузке.

    Веб-интерфейс профилировщика выводит таблички с информацией о каждой функции и сообщает следующую информацию:
    • Число вызовов каждой функции
    • Wall-time, время затраченное на выполнение функций (включая ожидание ответов от сокетов, файловой системы и т.д.).
    • CPU-time, время затраченное на выполнение функций (исключая ожидание ответов от сокетов, файловой системы и т.д.).
    • Использование памяти
    • Пиковое использование памяти


    Есть возможность сортировки таблицы по любому из параметров

    Информация по каждой функции делится еще на два вида Inclusive и Exclusive. Inclusive включает цифры использованные дочерними вызовами, а Exclusive не включает их. Так же есть возможность, кликнув на название функции увидеть информацию только по ней и функциям из которых она вызывалась и которые вызывались ей.

    Если в системе установлен GraphViz, профилировщик нарисует вам граф вызовов.

    P.S. Не нарушая традиций: это мой первый пост на хабре.

    UPD: перепостил в PHP.
    Поделиться публикацией
    Похожие публикации
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама
    Комментарии 20
    • +2
      Подсветку кода не забудьте, да и кат добавьте. А ещё, для привлечения внимания, обычно ставят картинку в тему в заголовок поста :)
      • 0
        Ну не судите строго. За него и был получен инвайт.
        • –3
          вас не судят. вам советуют =)
          p.s. прошло уже 7 часов, но изменений не увидели
          • 0
            Простите, я спал :)
            Вечером обновлю
            только про подстветку код не очевидно.
            Теги c o d e стоят, а как подстветку включить?
            • 0
              Нужно использовать сторонние сервисы.
              Вот, например
              • 0
                насчет «Вот» — не получилось.
                даже форматирование не сохранилось
                будем пробовать в следующих постах
                • 0
                  хм. а <source lang="{{ language }}">?
                • +1
                  используйте хабраредактор, там есть встроенная, потом результат скопируете просто
        • +1
          А какой этот неплохой WEBGUI к профайлеру?
        • 0
          А какая-то общая статистика при этом собирается или я смогу увидеть только то что было сделано для отображения текущей страницы?
          • 0
            Нет, только текущая страница.
            Профайлер создает файл на одну страницу:

            $profiler_url = sprintf('http://prof.my/index.php?run=%s&source=%s', $run_id, $profiler_namespace);

            Насчет суммарной статистики — можно подумать…
          • –1
            По моему, проще использовать IDE со встроенным профайлером. Например, Nusphere phpED.
            Кроме того, там собственный шикарный отладчик.
            Советую.
            • +1
              IDE на production-сервере использовать не будешь. А бывают моменты, когда надо посмотреть как ведет себя ПО на реальном сервере, с реальным объемом данных и нагрузкой.

              Мне xhprof помог найти узкие места.
            • 0
              >А бывают моменты, когда надо посмотреть как ведет себя ПО на реальном сервере, с реальным объемом данных и нагрузкой.

              профилировщик ставить на продакшен — жесть!

              нагрузку и данные надо приближать к реальным и тестировать, и еще раз тестировать. а потом уже выкладывать код на продакшен!

              вполне можно нагенерить с миллион любых случайных данных и гонять используя JMetr или иной симулирующий клиент.
              • 0
                Можно!
                Только иногда действительно необходимо посмотреть как ведет себя реальный продакшн-сервер.
                Тогда и спасает эта штука.
                О том какая кука нужна, чтобы профилировщик сработал — знаете только вы. Для всех остальных клиентов нагрузка увеличивается на несколько байт компиляции (в байт-код) и на два IF-а.

                Лично мне эта штука в свое время реально помогла.

                Иногда действительно полезно смотреть на продакшн — вспомните напримера расширение для PHP «Pinba» — Antony Dovgal не зря его писал я думаю.
              • 0
                [Хоть статья и старая, но может кому-нибудь пригодится комментарий]

                не официальный порт XHprof под Windows: dev.freshsite.pl/php-extensions/xhprof.html

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.