Webgrind – удобный интерфейс для анализа быстродействия PHP скриптов

Владимир | | PHP, Web разработка.

webgrind

О xDebug знает, наверное, каждый PHP разработчик. Этот отладчик позволяет получить подробную информацию о работе PHP скрипта.

Одной из самых интересные его возможностей является анализ производительности (profiling). Если говорить кратко, то в этом режиме xDebug отслеживает, какие функции были вызваны и сколько времени они выполнялись. Т.е. вы сможете легко найти «узкие» места в приложении.

Но результаты анализа записываются в текстовый файл в специальном формате, и просматривать его с помощью обычного редактора очень не удобно. Самыми известными приложениями для работы с этими файлами являеются KCacheGrind (под Linux) и WinCacheGrind (аналог для Windows).

Но недавно я узнал, что существует web приложение для просмотра файлов. Называется оно Webgrind.

Установка простая до предела:

1) Скачать и распаковать архив в папку на сервере.

2) Открыть файл config.php и указать размещение папки с результатами анализа производительности (profiling). Подробности ниже.

3) Запустить webgrind в браузере.

А вот настройка немного сложнее.

Прежде всего, рассмотрим настройки xDebug. Для того чтобы включить режим анализа производительности (profiling) нужно в php.ini задать следующие параметры:

[XDebug]

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.crc32

Теперь после выполнения любого php скрипта в папке E:/Docs/tmp появится файл cachegrind.out.crc32 с данными о вызванных функциях и времени их выполнения.

Настраиваем Webgrind. Для этого в файле config.php (находится в папке с Webgrind) нужно указать папку, в которой размещен cachegrind.out.crc32, т.е. указать туже папку, что и в параметре xdebug.profiler_output_name.

$storageDir = 'E:/Docs/tmp';

После этого запускаем какой-нибудь скрипт. xDebug создаст файл с результатами анализа. Теперь можно запускать Webgrind.

Важно. Нужно отключить profiler перед запуском Webgrind (xdebug.profiler_enable=1). Иначе в файл cachegrind.out.crc32 будут записываться результаты анализа производительности самого Webgrind, и одновременно он будет пытаться читать из этого файла. В результате браузер подвисает, а файл cachegrind.out.crc32 за пару минут увеличивается до 200 МБ.

В выпадающем списке выбираете нужный файл (cachegrind.out.crc32), выбираете формат отображения времени выполнения функций (процент от общего времени выполнения скрипта, миллисекунды или микросекунды) и нажимаете кнопку «Update».

Результаты, которые выдает Webgrind, показаны на скриншоте (кликните, чтобы увеличить).

etutorials webgrind profiling thumb

Как видите, было вызвано 192 функции, время выполнения которых составило 3227 мс. В столбце «Invocation Count» указано сколько раз вызывалась каждая функция.

Цифра в столбце «Total Self Cost» показывает, время выполнения самой функции, а в столбце «Total Inclusive Cost» — суммарное время выполнения функции и всех вызванных из неё функций.

По полученным данным несложно определить, что в данном примере основную часть времени выполнения скрипта заняло создание подключения к базе данных (функция mysql_connect).

Как видите, приложение довольно интересное и выглядит симпатично 😉 . В общем, советую попробовать.

До встречи!

  • Pingback: Linkdump #5 | CTAPbIu_MABP's BLOG()

  • Lammak

    Не видит список файлов Webgrind под Windows в чем беда? Хотя они там есть

    • У меня такая проблема возникала когда не совпадали
      xdebug.profiler_output_dir=»E:/Docs/tmp»
      и
      $storageDir = 'E:/Docs/tmp';

    • Стас

      У меня такое тоже было. В первую очередь это происходит из-за того, что при некоторых настройках xDebug и самого webgrind в файле cachegrind.out.crc32 оказывается лог загрузки самого webgrind, который он не видит. Я решил это просто, у меня вместо файла cachegrind.out.crc32 создаётся файл %s.xDebug.out.crc32И в результате эти файлы имеют разное название. Правда плодятс, особенно при наличии множества хостов, но для меня это приемлемо.

  • Александр

    Всё сделал по инструкции… Не работает… Использую OpenSewrver

    • Посмотрите какие параметры выводит phpinfo(). Они должны совпадать с параметрами, приведенными в статье.

    • Олег

      В php_info убедитесь, что модуль подключен

  • campusboy

    А каким инструментом можно увидеть где сколько памяти потребляется? А то где-то она сжирается, не могу понять где 🙂

    • Если я не ошибаюсь, на данный момент webgrind не показывать потребление памяти. Попробуйте использовать XHProf. Инструкция по установке https://www.digitalocean.com/community/tutorials/how-to-set-up-xhprof-and-xhgui-for-profiling-php-applications-on-ubuntu-14-04

      • campusboy

        Спасибо за ответ, Владимир, но по счастливой случайности я смог это видеть. Использую ОпенСервер, там поднастроил webgrind и xdebug. И теперь на странице, при генерировании которой переполняется память, вместо простой ошибки вылетает таблица со сводкой, какая функция сколько памяти сожрала и сколько времени обрабатывалась. Я доволен 🙂 в целом, webgrind настраивал, а такая фишка крутая получилась.

        • Пожалуйста 🙂
          А какую версию xdebug вы используете? Дело в том, что в каких-то версиях профилирование памяти не работало.

        • campusboy

          Судя по описанию ОпенСервера стоит Xdebug 2.4.0

  • Стас

    Подскажите пожалуйста, почему имён функций одни цифры? не пойму ничего )

    • Какие версии xdebug и webgrind у Вас установлены. Похожие проблемы были при обновлении xdebug, по-моему до версии 2.3.