PHP - Профилирование кода с помощью XDebug и WebGrind

2013-03-17
PHP, XDebug, WebGrind

Зачастую требуется находить в PHP скриптах те места кода, которые создают наибольшую нагрузку. Для того что это сделать, мы будем использовать XDebug. Этот инструмент создает лог работы PHP скрипта в своем специфическом формате. Для того что бы этот лог можно было читать, существуют разные программы. В этой статье речь пойдет об одной из них, под названием WebGrind.

WebGrind написан на PHP, поэтому кросс платформенный. Легок в установке и настройке. Программная платформа, на которую мы будем устанавливать XDebug: ОС Ubuntu 10.04, сервер Apache, PHP 5.3.2.

Установка и настройка XDebug

Для установки XDebug нам понадобятся дополнительные утилиты, установим их из консоли:

sudo apt-get install php5-dev

sudo apt-get install php-pear

Теперь устанавливаем сам XDebug:

sudo pecl install xdebug

sudo apt-get install php5-xdebug

Для того что бы XDebug начал профилировать наши PHP скрипты, необходимо его включить. Для этого откройте файл конфигурации XDebug:

sudo nano /etc/php5/apache2/conf.d/xdebug.ini

В него необходимо добавить одну строку:

xdebug.profiler_enable=On

Сохраните файл и перезагрузите Apache:

sudo /etc/init.d/apache2 restart

Установка WebGrind

Переходим по ссылке https://github.com/jokkedk/webgrind и скачиваем WebGrind. Далее распаковываем его на свой локальный web-сервер в виде обычного PHP скрипта. Например я для себя создал локальный хост tools в котором и расположил WebGrind:

PHP - Профилирование кода с помощью XDebug и WebGrind

Собственно на этом установка WebGrind завершена. Открываем webgrind в браузере как обычный локальный сайт. Например у меня это адрес: http://tools/webgrind/ у вас он может быть другим, в зависимости от того куда вы расположили его на своем локальном web-сервере.

Использование WebGrind

После того как мы установили и настроили XDebug и WebGrind, попробуем профилировать тестовый PHP скрипт. Я в качестве примера возьму старый тяжелый проект, написанный на ZendFramework.

И так, все что нам необходимо теперь сделать, это открыть наш проект в браузере и перейти на интересующую нас страницу, т.е. на ту, на которой были замечены тормоза. После того как мы это сделали, XDebug автоматически сгенерирует лог профайлинга, который останется только просмотреть с помощью WebGrind.

XDebug сгенерировал профайлинг лог для интересующей нас страницы, просмотрим его в WebGrind. Открываем WebGring и кликаем на иконку PHP - Профилирование кода с помощью XDebug и WebGrind, для того что бы обновить список сгенерированных профайлинг логов. Последние сгенерированные логи находятся в начале списка:

PHP - Профилирование кода с помощью XDebug и WebGrind

Выбираем необходимый профайлинг лог и нажмите на кнопку "Update", отобразится список функций и методов, выполненных при работе PHP скрипта. Причем эти методы и функции упорядочены по убыванию времени исполнения, т.е. самые тяжелые методы находятся вверху. Для того что бы найти конкретную строку в коде, которая создает нагрузку, кликните на имя интересующего вас тяжелого метода или функции. Раскроется список методов и функций, которые были в нем вызваны. В раскрывшемся списке самые тяжелые методы так же находятся в начале. Напротив интересующего нас тяжелого метода, щелкаем на иконку PHP - Профилирование кода с помощью XDebug и WebGrind:

PHP - Профилирование кода с помощью XDebug и WebGrind

В новой вкладке откроется исходник тяжелого файла, на строке, в которой вызывается тяжелый метод. В моем случае это тяжелый SQL запрос, все что мне остается с ним сделать, это оптимизировать его:

PHP - Профилирование кода с помощью XDebug и WebGrind

Как видите, WebGrind и XDebug это очень удобные инструменты для профилирования PHP кода. Кроме WebGrind существуют и другие программы для просмотра XDebug логов, например KCachegrind.