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

In software engineering, profiling ("program profiling", "software profiling") is a form of dynamic program analysis that measures, for example, the space (memory) or time complexity of a program, the usage of particular instructions, or the frequency and duration of function calls. Most commonly, profiling information serves to aid program optimization.

Другими словами, профилирование - вещь нужная и полезная. К сожалению, IDE напрямую в профилирование PHP не могут (сижу на Eclipse), поэтому придется совершить ряд телодвижений.

Xdebug

Xdebug - это расширение для PHP, позволяющее дебажить и профилировать код.

Установим его:

sudo apt-get install php5-xdebug

После чего открываем наш php.ini:

sudo nano /etc/php5/apache2/php.ini

и добавляем туда следующее:

# xdebug
xdebug.profiler_enable = OFF
xdebug.profiler_output_name = xdebug.out.%t
xdebug.profiler_output_dir = /tmp
xdebug.profiler_enable_trigger = ON

Где

  • xdebug.profiler_enable - по умолчанию профайлер выключен;
  • xdebug.profiler_enable_trigger - но его можно включать с помощью триггера, триггером служит переменная XDEBUG_PROFILE, переданная через печеньки, POST или GET запросы (т. е. чтобы запустить профайлинг файла index.php, его надо запустить с GET параметром index.php?XDEBUG_PROFILE);
  • xdebug.profiler_output_name - шаблон имен получаемых логов;
  • xdebug.profiler_output_dir - куда эти логи будут сохраняться (папка должна существовать и должны быть установлены права на запись).

Не забываем перезапустить Апач:

sudo service apache2 restart

Вот и все, собственно. Переходим в броузере на нужную страницу нужного нам сайта с добавлением GET запроса-триггера, смотрим папочку, куда пишутся логи. Должны начать появляться файлики, вот примерно с таким содержимым:

cfl=php:internal
cfn=php::preg_replace
calls=1 0 0
1450 0

И так несколько десятков тысяч строчек. А ведь хочется хоть какой-то визуализации, графиков там красивых. Тогда придется обзавестись вьювером логов. Их несколько, я остановился на KCachegrind.

KCachegrind

KCachegrind ставится все также элементарно:

sudo apt-get install kcachegrind

Буквочка "K" вначале названия программы как бы говорит о том, что делалось все под KDE, а мы скорее всего сидим под Gnome. Ну, потому что Gnome лучше KDE. Вот. Ну и из-за этого при старте программы могут полезть ошибки с klauncher. Лечится просто, надо доставить плагинов:

sudo apt-get install kdelibs5-plugins

Запускаем программку, открываем нужный файл логов и любуемся. А любоваться есть на что - листинг абсолютно всех вызываемых функций, количество вызовов, затраченное время в микросекундах, возможность просматривать источник каждой функции в исходном коде, ну и просто забавные графики:

xdebug

xdebug

xdebug

xdebug

И все бы хорошо, если не одно но. Xdebug версий 2.x не может в профилирование памяти. Совсем. А память она же важна. Очень. И профилировать ее тоже хочется. Вариантов основных два: использовать либо xhprof (поделка FaceBook'а), либо memprof. Я остановился на последнем, т. к. он позволяет генерировать логи для все того же KCachegrind'а.

memprof

Для установки выполняем следующие команды:

sudo apt-get install libjudy-dev libjudydebian1
sudo pecl install memprof

Потом создаем memprof.ini:

sudo nano /etc/php5/mods-available/memprof.ini

такого содержания:

extension = memprof.so

и под конец подключаем модуль и перегружаем Апач:

sudo php5enmod memprof
service apache2 restart

Как сие работает. В начале требуемого исходного кода надо включить memprof, а в конце сохранить логи в нужное нам место:

memprof_enable();
// Наш код.
memprof_dump_callgrind(fopen("/tmp/logs.out", "w"));

Ну а теперь осталось только открыть созданный файл логов в программе KCachegrind и смотреть кто сколько кушенькает памяти.

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

Содержимое данного поля является приватным и не предназначено для показа.