Сегодня я хочу продолжить тему профайлинга (profiling) web приложений с помощью XDebug.
Как известно, этот отладчик позволяет изучать производительность PHP скриптов. Такая операция называется профайлинг. В этом режиме XDebug после каждого выполнения PHP скрипта создает текстовый файл с данными о вызванных функциях и времени их выполнения.
Естественно, анализировать вручную такие файлы очень неудобно. Лучше использовать специальные инструменты.
Наиболее распространенным является KCacheGrind (под Linux) и WinCacheGrind (аналог для Windows). Но есть и web приложение для анализа этих файлов. Называется Webgrind.
Раньше я о нем немного рассказывал, но в той статье упустил несколько моментов, которые напрямую не относятся к Webgrind, но в тоже время позволяют сделать работу более комфортной.
Попробую объяснить. Прежде всего, нужно четко уяснить, что профайлинг выполняет не Webgrind, а XDebug. Причем он должен быть настроен соответствующим образом. Более того, с точки зрения XDebug Webgrind является обычным web приложением.
Проблема в том, что если включить профайлинг в php.ini
, то они будут применены для всех web приложений, в т.ч. и для Webgrind.
В такой ситуации получается, что Webgrind начинает тестировать сам себя. А это нам совершенно ни к чему.
Поэтому гораздо удобнее включить профайлинг только для тех сайтов, которые действительно нужно тестировать.
Но тут есть несколько нюансов.
Прежде всего, рассмотрим, какие настройки нужно сделать, чтобы включить профайлинг в XDebug. Здесь ничего сложного, просто добавляем в php.ini следующие параметры.
xdebug.profiler_enable=1 xdebug.extended_info=0 xdebug.remote_enable=0 xdebug.auto_trace=0 xdebug.profiler_output_dir="E:/Docs/tmp" xdebug.profiler_output_name=cachegrind.out.%t
Здесь первый параметр включает профайлинг, второй — отключает расширенную информацию, третий — отключает режим отладки (он не имеет смысла во время профайлинга, т.к. искажает его результаты), четвертый — отключает трассировку (см. предыдущий пункт), пятый — указывает папку в которую будут складываться файлы с результатами профайлинга, шестой — указывает имя файла (%t означает, что к имени файла будет добавлена текущее время, посмотреть полный список параметров можно здесь).
Если вы перенесете эти настройки в php.ini
, то профайлинг будет работать для всех web приложений.
Но, как я уже говорил, такой вариант нам не подходит.
Нам нужно сделать так, чтобы эти параметры применялись только для заданного web приложения.
Для этого достаточно выполнить всего два шага.
1) Создать виртуальный хост (с помощью директивы <VirtualHost>).
2) Внутри этой директивы (<VirtualHost>) указать настройки XDebug. Примечание. Здесь есть один нюанс, о котором я расскажу чуть ниже.
Например, если web приложение находится в папке E:\www\mysite
, а мы хотим, чтобы оно было доступно по адресу www.mysite.local, то создать виртуальный хост можно так.
<VirtualHost 127.0.0.1> ServerName www.mysite.local DocumentRoot "E:/Docs/www/mysite" ServerAlias mysite.local *.mysite.local php_flag xdebug.profiler_enable on php_flag xdebug.extended_info off php_flag xdebug.remote_enable off php_flag xdebug.auto_trace off php_value xdebug.profiler_output_name cachegrind.out.%t </VirtualHost>
После этого остается только добавить в файл C:\Windows\System32\drivers\etc\hosts
строку
127.0.0.1 mysite.local www.mysite.local
и перезапустить web сервер.
Как видите, формат установки параметров немного изменяется. Директива php_flag
используется для установки булевых параметров, а php_value
— остальных.
Теперь возвращаемся к тому нюансу, о котором я говорил. Вы, наверное, заметили, что при создании виртуального хоста мы не устанавливаем параметр xdebug.profiler_output_dir
. Дело в том, что его лучше оставить в php.ini
. Тогда можно будет не настраивать Webgrind. Он сам прочитает этот параметр и будет искать файлы с результатами в соответствующей папке.
Остается установить Webgrind. Для этого просто распаковываем его в какую-нибудь папку на сервере. Например, так, чтобы он был доступен по адресу localhost/webgrind
.
Теперь можно приступать к работе 😉
Не забывайте, изменения в php.ini
применятся только после рестарта сервера.
Если есть вопросы — задавайте, буду рад ответить 🙂