Часто для этого используются конструкции и функции языка в разных сочетаниях:
code:
echo, exit, var_dump(), print_r()
Для анализа работы скрипта они прописываются в контрольные точки и по выведенному результату анализируются значения переменных в этих точках. Если ошибка так и не была найдена, то отладочные команды помещаются в другое место. Очевидно, что это быстро утомляет. Специально для таких случаев в языках программирования применяется отладчик. Дебаггер позволяет остановить выполнение скрипта в определённой точке (поставить брейкпоинт или точку останова), просмотреть содержимое переменных в этот момент, при необходимости модифицировать значение переменных и запустить выполнение дальше.
В PHP нет встроенных средств отладки, но можно использовать внешние отладчики, подключаемые как отдельные расширения (например xdebug, DBG, Zend Debugger). В NuSphere PhpED используется расширение DBG, которое по совместительству является ещё и профайлером.
Отладчик в PhpED по праву именуется интерактивным. Он поддерживает отладку WEB-приложений по следующей схеме:
- Запускаем отладчик.
- Переходим в интересующий нас участок кода и устанавливаем breakpoint.
- Открываем браузер.
- Запускаем скрипт используя адресную строку браузера или отправив данные через форму.
- Отладчик вываливается на установленной точке останова, пропустив весь код до нее.
Далее мы можем просматривать значение переменных и выражений, историю вызова функций и т. д.
В этой небольшой статье я расскажу как настроить отладку с ипользованием PhpED и OpenServer. Те моменты которые касаются настройки OpenServer могут быть применены к любому WEB-серверу из коробки (Denwer, XAMPP) или установленному на *nix-системе. Итак, если все умственные усилия обнаружить ошибку закончились безрезультатно и хождение по форумам с просьбой разобраться почему неправильно работает скрипт потерпели фиаско, то переходим к настройке дебаггера.
Инструкция приведена для актуальных (последних) версий программ на момент написания статьи:
- Microsoft Windows 7 SP1 x64 (en)
- NuSphere PhpED Professional v7.0
- OpenServer v4.6.1 (PHP v5.3.16)
Настройка
Находим в каталоге с установленной IDE DLL-файл с именем «dbg-php-X.X.dll», где X.X версия поддерживаемого интерпретатора PHP, установленного на сервере. В моём случае это будет «dbg-php-5.3.dll». Библиотека должна находится в каталоге «%PROGRAMFILES%\NuSphere\PhpED\debugger\server\Windows\x86_VC9\», т. к. PHP v5.3.16 скомпилирован с поддержкой VC90 runtime.
Копируем его в каталог «%OpenServer%\modules\php\PHP-5.3.16\ext\», где %OpenServer% — директория с установленным OpenServer.
Редактируем php.ini. Открываем контекстное меню OpenServer в системном трее. Далее: Дополнительно > Конфигурация > PHP-5.3.16. Добавляем строку содержащую: extension=dbg-php-5.3.dll
Сохраняем и закрываем текстовый файл.
Перезапускаем сервер.
В любом скрипте делаем вызов phpinfo(). И убеждаемся, что на странице диагностики присутствует блок, посвященный библиотеке dbg-php-5.3.dll:
В настройках проекта (Project > Project Properties) указываем: Root directory — корневой каталог проекта на компьютере; Run mode — HTTP mode (3rd party WEB server); Root URL — URL проекта по которому он доступен. Сохраняем изменения.
Я предпочитаю не использовать глобальные настройки дебаггера в программе, поэтому в настройках отладчика проекта (вкладка Debugger) включаю использование специфических настроек отладки для проекта. И обычно снимаю флажок остановки на первой инструкции скрипта (Break on start). Как видно, там же можно указать на каких ошибках передавать управление отладчику.
Установив точку останова, а так же введя в строке браузера URL-проекта. И дополнив URL GET-параметром DBGSESSID со значением большим нуля (ID сессии), мы поймаем исключение. В дальнейшем до момента закрытия вкладки браузера этот параметр можно исключить, т. к. он будет сохранен в cookie.
httр://example.com/?DBGSESSID=1
В окне Locals видны значения всех локальных переменных.
Остановить отладку можно по хоткею Ctrl + F2.
Совет - не забываем включить отображение всех ошибок (E_ALL). В скрипте (не сработает при синтаксических ошибках): error_reporting(E_ALL);
Или в .htaccess: php_flag display_errors 1
Исходник статьи смотрим здесь.