О сайтах и не о сайтах

Теперь и в tg!

tg

Переехал с твиттера на t.me/tulvit_blog, если что.

Профилирование 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 и смотреть кто сколько кушенькает памяти.