Создание и сопровождение сайтов

Блог. Разработка. Отладка и поиск "узких" мест в коде при помощи xdebug

Поиск

xdebug – это расширение для PHP, написанное одним из разработчиков языка PHP - Derick Rethans.

Первым делом нам необходимо установить xdebug. В качестве сервера будет выступать популярный Denwer.

  • Качаем dll отсюда - http://www.xdebug.org/download.php. Либо вставляем из браузера содержимое phpinfo() на странице http://www.xdebug.org/find-binary.php и скрипт сам подберёт нам нужную сборку и версию.
  • Копируем файл в usr/local/php5/ext/
  • Правим php.ini. Если есть zend_extension_ts - комментим и добавляем zend_extension_ts = "/usr/local/php5/ext/php_xdebug-2.1.2-5.3-vc6.dll" (имя файла может отличаться). Если нет - просто добавляем в конец файла
  • добавляем в php.ini в конец: general settings
    xdebug.auto_trace=0
    xdebug.collect_includes=1
    xdebug.collect_params=1
    xdebug.collect_return=0
    xdebug.default_enable=1
    xdebug.extended_info=1
    xdebug.show_local_vars=1
    xdebug.show_mem_delta=1
    xdebug.max_nesting_level=100
    xdebug.trace_format=0
    xdebug.trace_output_dir= "D:/logs/"
    xdebug.trace_options=0
    xdebug.trace_output_name=timestamp
    ; debugger settings
    xdebug.remote_autostart=0
    xdebug.remote_enable=1
    xdebug.remote_handler=dbgp
    xdebug.remote_host=127.0.0.1
    xdebug.remote_mode=req
    xdebug.remote_port=9000
    ; profiler settings
    xdebug.profiler_append=0
    xdebug.profiler_enable=1
    xdebug.profiler_enable_trigger=1
    xdebug.profiler_output_dir= "D:/logs/"

    где D:/logs/ - каталог, куда будут записываться логи.
  • Качаем http://sourceforge.net/projects/wincachegrind/
  • Запускаем сервер, открываем страничку с phpinfo() и если видим:
    xdebug1 значит установка прошла успешно.

 

Решение причин, по которым вы можете не увидеть данную надпись:

  1. Вероятно установлен zend optimizer, закомменируйте такие строчки в php.ini
    [Zend]
    ;zend_extension_ts = "/usr/local/php5/ext/php_oprimizer.dll"
    ;zend_extension_manager.optimizer_ts="/usr/local/php5/zend/"
    ;zend_optimizer.enable_loader = 1
    ;zend_optimizer.optimization_level = 15
  2. Замените в php.ini "zend_extension_ts" на "zend_extension"
  3. Укажите полный путь, например ;zend_extension = "C:\WebServers\usr\local\php5\ext\php_xdebug.dll"
  4. Вы скачали не подходящую версию xdebug с сайта, попробуйте другую

 

Теперь к практике. Протестируем производительность Open Real Estate.

Прежде отключим кеширование.

В панели администратора, в секции "Настройки", выставьте "Время кеширования объектов и сложных объектов" в значения "0".

Затем откройте файл protected\config\db.php и ключу schemaCachingDuration задайте значение 0.

Запустим сайт, после загрузки откроем скаченную программу WinCacheGrind и выберем в папке D:\logs\ записанный лог:

xdebug without cache

сразу можно сказать, что на отображение страницы было потрачено примерно 1,9 секунды.

Кликая по названиям методов можно найти какая функция выполняется дольше всех и прооптимизировать её.

Либо включить кеширование, которое существует в продукте.

Откройте снова файл protected\config\db.php и задайте ключу schemaCachingDuration значение 3600 (включаем кеш схемы базы данных на 1 час):

xdebug caching scheme

 

И в админке, в секции "Настройки" для значений "Время кеширования объектов и сложных объектов" также поставьте значения 3600:

 xdebug caching query

 

После этого два раза обновите сайт. Почему два? Потому что в первый раз объекты закешируются, а во второй раз уже будут отдаваться из кеша:

xdebug with cache

 

Как видим время уменьшилось почти на полсекунды и это с демо-контентом, а когда у вас на сайте будет больше объявлений, новостей и т.п, то и выигрыш во времени будет значительнее.

После установки xdebug также изменяется вывод ошибок, нотисов т.п:

notice

Можно увидеть не только в каком файле не объявлена/существует переменная, но и время выполнения и объём используемой памяти при каждом действии.

Так как в php.ini у нас объявлено

xdebug.show_local_vars=1

то можно также увидеть значение всех переменных на странице:

variables

А для отображения всех значений REQUEST, которые были переданы в скрипт, используйте:

xdebug.dump.REQUEST =*

или только GET - xdebug.dump.GET=*

Вы также можете вывести значения других суперглобальных переменных GET, POST, SERVER, COOKIE, FILES, REQUEST или SESSION.

И напоследок один маленький совет: крайне нежелательно устанавливать xdebug на работающие сервера, так как производительность от него пострадает.

Обсудить статью на форуме