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