.
Решение
- Описание
- Установка Xdebug
- Все важные настройки для Xdebug в файле php.ini
- Отладка массивов и классов PHP
- Трассировка кода
Описание
XDebug - мощное расширение для отладки php-скриптов, которое написал норвежец Дерик Ретанс (Derick Rethans, http://www.derickrethans.nl, project leader for the eZ components). Работает как под Windows, так и под Linux.
XDebug, в первую очередь, - хороший и легкий в установке профайлер, помогающий разработчику найти «узкие места» в коде, определить какие части вашего кода работают медленно: запросы к БД, подключение файлов, парсинг чего-либо и т.д.
Xdebug вмешивается в процесс для предотвращения бесконечных рекурсий, добавляет в сообщения об ошибках информацию о трассировке стека и функций, следит за распределением памяти, а также выполняет некоторые другие функции. Xdebug содержит также набор функций, которые вы можете добавить в свой код для получения диагностических данных времени выполнения.
Установка Xdebug
Этот пакет входит во многие дистрибутивы Линукс и его можно легко установить.
См. также "Пример компиляции Xdebug в Linux/Unix".
Проверка установки
Для проверки корректности установки и разрешения работы расширению Xdebug перезапустите ваш Web-сервер, затем создайте простое однострочное PHP-приложение с кодом
Если вы укажете адрес файла в браузере (например, http://localhost/phpinfo.php) и прокрутите выведенную информацию вниз, то увидите раздел Xdebug.
Если этого раздела нет в phpinfo(), то Xdebug не загрузился.
Причины неправильной установки
log-файлы ошибок вашего сервера Apache могут указать причину. К обычным ошибкам относится:
- неправильный путь для zend_extension,
- конфликт с другим расширением. Например, если вы хотите использовать XCache и Xdebug, первым загружайте XCache. Однако, поскольку Xdebug предназначен для использования во время разработки и предполагая, что путь к xdebug.so указан правильно, запретите другие расширения и попробуйте еще раз. Затем можно повторно разрешить расширения для выполнения других проверок, например, эффективности кэширования.
На сайте Xdebug приведены также некоторые другие советы по решению возможных проблем.
Все важные настройки для Xdebug в файле php.ini
При возникновении ошибок нужно ответить на четыре вопроса. Xdebug может предоставить всю нужную информацию, причем немедленно. Вот для начала несколько полезных настроек.
Сохраните эти настройки в файле php.ini, а затем перезапустите ваш Web-сервер:
xdebug.default_enable = On
; разрешает трассировку исключительных ситуаций, даже
; если вы перехватили исключительную ситуацию:
xdebug.show_exception_trace = On
; выводит все локальные переменные самой внешней области видимости
; каждого вызова функции, включая еще не инициализированные переменные:
xdebug.show_local_vars = 1
;ограничение глубины рекурсии:
xdebug.max_nesting_level = 50
; указывает глубину вывода комплексной переменной:
xdebug.var_display_max_depth = 6
; управляют тем, какие суперглобальные переменные PHP
; включаются во все диагностические результаты
xdebug.dump_once = On
xdebug.dump_undefined = On
xdebug.dump.REQUEST = *
xdebug.dump.SERVER = REQUEST_METHOD,REQUEST_URI,HTTP_USER_AGENT
; для вывода суперглобальных переменных, перечисленных
; в настройках xdebug.dump.SUPERGLOBAL:
xdebug.dump_globals = On
Подробности настройки: http://www.ibm.com/developerworks/ru/library/os-php-xdebug/index.html#configuring
Отладка массивов и классов PHP
Xdebug предоставляет расширенную функцию var_dump(), которая особенно полезна для массивов и классов PHP. Например, в листинге 6 приведен простой (PHP V4) класс и экземпляры.
Трассировка кода
При разрешенной трассировке Xdebug регистрирует каждый вызов функций, включая аргументы функции и возвращаемое значение. Можно отформатировать каждый log-файл для более удобного его восприятия человеком или машиной. Первый вариант вы можете просматривать сами, а для второго можно написать отдельное приложение для анализа.
Настройка трассировки в php.ini
; автоматически разрешает трассировку до выполнения любого PHP-сценария:
xdebug.auto_trace = On
; управляют тем, где сохраняется информация трассировки:
xdebug.trace_output_dir = /tmp/traces
; каждый файл начинается с trace, за которым следует
; имя PHP-сценария (%s) и идентификатор процесса (%p):
xdebug.trace_output_name = trace.%c.%p
xdebug.collect_params = 4
xdebug.collect_includes = On
xdebug.collect_return = On
xdebug.show_mem_delta = On
Названия всех файлов трассировки Xdebug заканчиваются суффиксом .xt.
Автотрассировка
Настройка xdebug.auto_trace = 1 автоматически разрешает трассировку до выполнения любого PHP-сценария. В качестве альтернативы можно установить xdebug.auto_trace = 0 и использовать функции xdebug_start_trace() и xdebug_stop_trace() из вашего кода для разрешения и запрета трассировки соответственно. Однако если xdebug.auto_trace установлен в значение 1, можно начать трассировку до включения сконфигурированного auto_prepend_file.
Формат данных трассировки
По умолчанию Xdebug отображает поля времени, использования памяти, имени функции и глубины вызова функции. Если установить xdebug.trace_format в значение 0, информация выводится в виде, удобном для чтения человеком (для машинного формата используется значение 1). Кроме того, можно обнаружить рост или уменьшение использования памяти при указании xdebug.show_mem_delta = 1, а тип и значения входящих параметров можно выводить, указав xdebug.collect_params = 4. Для отслеживания значения, возвращаемого каждой функцией, установите xdebug.collect_return = 1.
Чтение результатов трассировки
Ниже показана трассировка PHP-генератора чисел Фибоначчи, вычисляющего четыре числа Фибоначчи:
0.0004 16432 +16432 -> {main}() /var/www/catalog/t/fibonacci.php:0
0.0006 16696 +264 -> fib('4') /var/www/catalog/t/fibonacci.php:35
0.0007 16696 +0 -> fib(3) /var/www/catalog/t/fibonacci.php:7
0.0007 16736 +40 -> fib(2) /var/www/catalog/t/fibonacci.php:7
0.0007 16848 +112 -> fib(1) /var/www/catalog/t/fibonacci.php:7
>=> 1
0.0008 16904 +56 -> fib(0) /var/www/catalog/t/fibonacci.php:7
>=> 0
>=> 1
0.0009 16904 +0 -> fib(1) /var/www/catalog/t/fibonacci.php:7
>=> 1
>=> 2
0.0009 16904 +0 -> fib(2) /var/www/catalog/t/fibonacci.php:7
0.0009 16904 +0 -> fib(1) /var/www/catalog/t/fibonacci.php:7
>=> 1
0.0010 16904 +0 -> fib(0) /var/www/catalog/t/fibonacci.php:7
>=> 0
>=> 1
>=> 3
>=> 1
0.0011 12528
TRACE END [2007-06-06 14:17:17]
Значения колонок:
- время,
- суммарное использование памяти,
- инкрементное использование памяти,
- вызовы функций, включая параметры.
Строки, отмеченные символами >=>, показывают возвращаемое значение из каждой функции (для сопоставления вызова функции с возвращаемым ею значением нужно найти -> с соответствующим отступом). Опять же, последнее значение >=> 1 является значением, возвращаемым функцией main().
Цветовое выделение дампа трассировки для vim
Для vim есть набор правил цветового выделения синтаксиса для файлов трассировки Xdebug. Эти правила содержатся в файле xt.vim в пакете исходных кодов Xdebug. В современных дистрибутивах Linux просто скопируйте xt.vim в $VIMRUNTIME/syntax/xt.vim, а затем запустите vim tracefile.xt.
Полезные рецепты по этой теме
Использованные материалы
Полезные ссылки
- Документация по Xdebug
- Как сделать PHP-приложения быстрыми, еще более быстрыми, самыми быстрыми, часть 2: Профилирование PHP-приложения для поиска, диагностирования и ускорения медленного кода
- Найдите ошибки в PHP-приложениях при помощи Xdebug
- Introducing xdebug
- XDebug — если при отладке вам надоели echo(), var_dump() и print_r(). Часть 1.
- XDebug — если при отладке вам надоели echo(), var_dump() и print_r(). Часть 2.
- Profiling PHP Applications With xdebug










