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

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

XHProf

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

Установка прошла достаточно быстро и гладко.

bash
  1.  
  2. wget http://pecl.php.net/get/xhprof-0.9.2.tgz
  3. tar xvf xhprof-0.9.2.tgz
  4. cd xhprof-0.9.2/extension/
  5. phpize
  6. ./configure && make && make install
  7. cd /usr/local/etc/php.d/
  8. vim xhprof.ini
  9. cd /usr/local/
  10. vim header.php
  11. vim footer.php
  12. vim etc/php.ini
  13. /etc/init.d/php-fpm restart
  14. cp vhost.conf.template prof.my.conf
  15. sed -i s/site/prof/ prof.my.conf
  16. vim prof.my.conf
  17. /etc/init.d/nginx restart
  18.  

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

xhprof.ini

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

в php.ini я добавил 2 строки, разовор о которых пойдет ниже

ini
  1. auto_prepend_file = /usr/local/header.php
  2. auto_append_file = /usr/local/footer.php

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

nginx
  1. server {
  2. listen 80;
  3. server_name prof.my;
  4. charset utf8;
  5.  
  6. root /usr/local/src/xhprof-0.9.2/xhprof_html ;
  7. location / {
  8. index index.php;
  9. }
  10.  
  11. location ~ \.php$ {
  12. fastcgi_pass 127.0.0.1:12000;
  13. fastcgi_index index.php;
  14. fastcgi_param SCRIPT_FILENAME /usr/local/src/xhprof-0.9.2/xhprof_html/$fastcgi_script_name;
  15. include fastcgi_params;
  16. }
  17. }

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

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

header.php

php
  1. <?php
  2. if (extension_loaded('xhprof')) {
  3. include_once '/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_lib.php';
  4. include_once '/usr/local/src/xhprof-0.9.2/xhprof_lib/utils/xhprof_runs.php';
  5. xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
  6. }

footer.php

php
  1. <?php
  2. if (extension_loaded('xhprof')) {
  3. $profiler_namespace = 'myapp'; // namespace for your application
  4. $xhprof_data = xhprof_disable();
  5. $xhprof_runs = new XHProfRuns_Default();
  6. $run_id = $xhprof_runs->save_run($xhprof_data, $profiler_namespace);
  7.  
  8. // url to the XHProf UI libraries (change the host name and path)
  9. $profiler_url = sprintf('http://prof.my/index.php?run=%s&source=%s', $run_id, $profiler_namespace);
  10. echo <<<OUT
  11. &lt;a style="display:block; position: absolute; top: 0; text-align: center; width: 150px; font-weigth:bold; color:yellow; background: #495; font-size:18px; padding: 3px; height: 27px; -moz-border-radius: 0 0 13px 0 ;" href="$profiler_url" target="_blank"&gt;Profiler output&lt;/a&gt;
  12. OUT;
  13. }
  14.  

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

Внимание! Что будет если в хедере и футере добавить проверку на куки? Правильно! Профилировщик будет срабатывать только для тех кто сможет его включить, а следовательно мы сможем исползовать профилировщик даже на продакшн и только для себя. На реальных данных, на реальных нагрузках. Круто?

Веб-интерфейс профилировщика выводит таблички си информацией о каждой функции и сообщает следующую информацию:

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

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

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

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

Скриншоты:









Комменты

Добавить коммент