Пользователь
0,0
рейтинг
16 декабря 2009 в 01:38

Разработка → Профилирование PHP-кода

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.
Maxim Antonov @maxidler
карма
39,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (20)

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

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