Как правильно дебажить php проект?
Добрый день, подскажите пожалуйста как правильно дебажить проект, проект на опенкарте — проблема в том что я не могу никогда выйти на точку останова к примеру есть некая функция я там ставлю точку останова предположительно в ней косяк, но у меня дебагер открывается с index php — самого начала а не с этой точки что я делаю не так?

- Вопрос задан более трёх лет назад
- 1420 просмотров
4 комментария
Простой 4 комментария
Отладка — Основы PHP
Один из наиболее достоверных способов убедиться, что человек разбирается в программировании — посмотреть, как он отлаживает программу, анализирует возникающие ошибки и устраняет их.
Навык отладки не появляется сам по себе, его необходимо развивать, и начинать это нужно как можно раньше. Этому способствует настройка локальной среды разработки и повторение всего, что делается в курсах у себя на компьютере. Следующие курсы как раз помогают проделать эти шаги.
Первое, что вам понадобится для отладки — хотя бы минимальное знание английского языка и умение пользоваться словарем.
В отличие от документации языка, которую можно найти на русском, сообщения об ошибках всегда отображаются на английском. Не пытайтесь отгадывать или менять код методом тыка, в надежде, что он заработает.
Прочитайте сообщение об ошибке, поймите его — это ключевое действие, на основе которого можно планировать дальнейшие шаги:
function App\Users\undef() /usr/src/app/src/Users.php:9 /usr/src/app/tests/UsersTest.php:27
Вывод ошибок делится на две части: непосредственно сообщение с ошибкой и бэктрейс.
Бэктрейс (он же «стектрейс») — это список всех вызовов функций от запуска программы вплоть до того места, где произошла ошибка. Это очень важный инструмент, который позволяет увидеть, как выполнялась ваша программа и какие функции вызывались.
Отладка всегда сводится к двум вещам:
- Перевести сообщение об ошибке
- Найти в бэктрейсе место в своем коде, после которого произошла ошибка
Каждая строчка в бэктрейсе представляет собой указание на файл и строчку, в которой была вызвана соответствующая функция. Бэктрейс называется back, потому что вывод строк идет в обратном порядке: наверху находится последний вызов, внизу — первый.
В рамках одного бектрейса возможны ситуации, когда часть функций вызывается где-то в сторонних библиотеках, а часть — в вашем коде.
Типы ошибок
Наиболее простые и понятные ошибки — синтаксические. Они связаны с тем, что код записан неверно: например, забыта точка с запятой в конце инструкции.
В выводе таких ошибок всегда присутствуют фразы parse error и syntax error.
Чтобы их исправить, нужно внимательно изучить то место в коде, на которое указывает ошибка:
'>' in /usr/src/app/src/Users.php on line 7
Еще одна большая группа ошибок называется ошибками программирования. Например, к ним относятся:
- Вызов несуществующей функции
- Использование необъявленной переменной
- Передача неверных аргументов в функции, например, аргументов, имеющих неверный тип
Эти ошибки исправить труднее, чем синтаксические. Обычно они возникают в результате неправильной логики в другом, более раннем вызове.
Последний тип ошибок — логические. Исправить такие ошибки бывает крайне сложно, так как программа продолжает работать, но выдает неверный результат. Причем обычно программа выдает неверный результат не всегда, а только лишь для некоторых входных данных.
В подавляющем большинстве случаев проблема кроется в неверной логике, например, перепутана операция и вместо сложения выполняется вычитание:
// Функция должна считать сумму чисел, но считает разность: function sum($a, $b) return $a - $b; >
Отладка
Существует множество способов отладить программу, но какой бы способ вы ни выбрали, общая идея отладки сводится к анализу того, как меняются значения переменных в процессе работы кода.
Рассмотрим конкретный пример. Ниже описана функция, которая считает сумму чисел от числа $start до числа $finish . Если начало равно трем, а конец — пяти, то программа должна вычислить: 3 + 4 + 5 :
function sumOfSeries($start, $finish) $sum = 0; for ($i = $start; $i $finish; $i++) $sum += $i; > return $sum; >
В этом коде допущена ошибка. Вы ее видите? Если очень постараться, ее можно заметить, но на это никогда не надо надеяться.
Новички часто думают, что они невнимательны и очень расстраиваются, когда допускают такие ошибки. Хотим вас успокоить: опытные разработчики допускают такие ошибки не реже новичков.
Не так важно, что вы их допускаете. Главное — чтобы вы умели отладить этот код. Этим отличаются опытные разработчики от начинающих. Никогда не пытайтесь найти ошибку с помощью медитации над кодом, сверля его взглядом. Если быстрая проверка не дала ответа, то приступайте к отладке.
Некоторые начинающие разработчики думают, что опытные программисты могут просто взглянуть на код и понять, в чем ошибка. Это совсем не так. Просто глядя на такой код, невозможно понять, а что, собственно, пошло не так, уже не говоря о нахождении самой ошибки. Нам также нужно увидеть сообщение об ошибке и начать отладку.
Глядя на код функции sumOfSeries замечаем, что основных переменных там две: $i и $sum , именно они меняются в цикле. Из этого можно сделать ровно один вывод: нужно явно посмотреть, какие значения им даются на каждой итерации. После этого найти ошибку не составит труда.
Один из способов отслеживать значения переменных во время выполнения кода связан с использованием отладчиков. Отладчики интегрируются с популярными редакторами и позволяют визуально выполнить код по шагам, отслеживая любые изменения. Подробнее о том, как их использовать можно прочитать во множестве статей. Их можно найти по запросу: xdebug php .
В среде Хекслета отладчика нет, поэтому здесь та же задача выполняется другим способом — с помощью отладочной печати.
Суть такая же, как и в визуальном отладчике, но для вывода значения переменных используется обычная печать на экран:
function sumOfSeries($start, $finish) $sum = 0; for ($i = $start; $i $finish; $i++) print_r('new iteration . '); print_r($i); $sum += $i; print_r($sum); > return $sum; > sumOfSeries(3, 5); // new iteration . // 3 // 3 // new iteration . // 4 // 7
То, что печатается на экран, отображается во вкладке OUTPUT , на которую автоматически переключается редактор во время проверки. Из этого вывода сразу можно понять, что количество итераций цикла меньше, чем нужно на одну. Почему-то не выполняется сложение для последнего числа, которое обозначено как $finish . И действительно, если посмотреть на определение, то видно, что там используется $i < $finish вместо $i
Отладочная печать через print_r не очень удобна тем, что эта функция не ставит автоматически перенос строк. К тому же иногда хочется завершить выполнение кода сразу, как только был сделан первый вывод.
Для решения этой задачи на Хекслете подключена библиотека var-dumper . Она предоставляет две функции: dump и dd , которые доступны в любом месте программы. Первая просто красиво выводит переданный аргумент, а вторая — еще и останавливает выполнение кода:
$var = 'hello, world!'; dump($var);
Эта функция добавляет в вывод перевод строки, но особенно удобно использовать ее с массивами, которые мы скоро изучим.
Дополнительные материалы
- Как найти ошибки в коде?
- Psysh: REPL и интерактивный дебаггер для PHP
![]()
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Как дебажить php
PHP поставляется с базовым интерактивным отладчиком командной строки phpdbg.
В большинстве IDE есть поддержка » Xdebug, бесплатного инструмента отладки, который позволяет выполнять отладку PHP-приложений в один шаг.
User Contributed Notes
There are no user contributed notes for this page.
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Удалённая отладка PHP с помощью Xdebug и PhpStorm
Xdebug представляет собой расширение PHP, предназначенное для отладки и профилирования PHP-скриптов. Его использование позволяет повысить эффективность разработчика за счёт ускорения процесса получения отладочной информации. Разработчик сможет быстрее определить причину ошибки, сможет быстрее понять логику работы незнакомого куска кода.
В данной статье речь пойдёт о том, как настроить отладку в PhpStorm на основе Xdebug, если проект расположен на удалённом сервере, а не развёрнут локально на машине разработчика. Приведу минимальный список шагов, который необходим для начала отладки, без углублённого изучения обширного функционала отладки PhpStorm.
Шаг первый
Устанавливаем и включаем расширение Xdebug для PHP в соответствии с документацией.
Добавляем настройки в конфигурационный файл (xdebug.ini). Смотрим описание параметров при необходимости.
xdebug.remote_enable=1 xdebug.remote_host=localhost xdebug.remote_port=9000 xdebug.profiler_enable=0 xdebug.profiler_output_dir=/tmp xdebug.profiler_output_name="debug-cachegrind.out" xdebug.profiler_append=1 xdebug.profiler_enable_trigger=1
Шаг второй
Устанавливаем расширение для браузера. Оно необязательно и нужно лишь для упрощения активации отладчика. Если не использовать расширение, понадобится вручную задать GET/POST или COOKIE параметр.
Шаг третий
Настраиваем SSH-туннель к удалённому серверу с помощью командной строки на локальной машине.
ssh -R 9000:localhost:9000 @ -p
Шаг четвёртый
Создаём проект в PhpStorm, если он ещё не создан. При этом необязательно выгружать на локальную машину всю кодовую базу проекта — можно загрузить только те файлы, которые нужны для отладки. Конечно, со всей кодовой базой будет гораздо удобнее.
В панели инструментов жмём на кнопку Start Listening for PHP Debug Connections, чтобы PhpStorm начал обрабатывать входящие соединения от Xdebug. Данный функционал также можно включить через главное меню Run | Start Listening for PHP Debug Connections. Повторное нажатие кнопки вернёт всё как было.
Шаг пятый
Задаём точку останова, активируем отладчик (с помощью параметра или расширения) и открываем в браузере страницу для отладки. Если PhpStorm смог автоматически определить соответствие файлов локального проекта с файлами на удалённом сервере, то сразу будет открыто окно отладки. В противном случае (например, если нужный файл отсутствует на локальной машине) PhpStorm предложит задать соответствие вручную, предложив наиболее подходящие варианты.
На этом настройка завершена. В заключение несколько замечаний:
-
В документации PhpStorm имеется большой раздел, посвящённый настройке функционала отладки. Он будет полезен при возникновении трудностей. В PhpStorm кроме поддержки Xdebug имеется поддержка Zend Debugger. Для проверки того, что SSH-туннель работает, а Xdebug присылает отладочную информацию, можно использовать клиент для командной строки. При наличии проблемы это поможет определить правильность настройки, исключая фактор IDE. Если вы столкнулись с ошибкой «Cannot accept external Xdebug connection: Cannot evaluate expression ‘isset($_SERVER[‘PHP_IDE_CONFIG’])'», то это может свидетельствовать о множестве причин. В моём случае были одновременно включены Xdebug и Zend Debugger. Отключение Zend Debugger решило проблему.
