Отладка PHP CLI¶
Отладить PHP-скрипт, который стартует, отрабатывает и завершается.
Предпосылки¶
php-dbgp-adapterвPATH:
- Xdebug, установленный в том PHP, который будет выполнять скрипт
Настройки Xdebug¶
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_host=localhost
xdebug.client_port=9003
localhost — потому что здесь PHP работает на той же машине. В контейнере было
бы host.docker.internal.
Конфиг¶
version = 1
default = "cli"
[profiles.cli]
adapter = "php"
program = "."
[profiles.cli.launch_arguments]
sessionMode = "cli"
port = 9003
Важна здесь строка sessionMode = "cli": она говорит, что придёт одноразовый
процесс.
Запуск — порядок важен¶
Сначала listener, потом скрипт
Одноразовый процесс может завершиться раньше, чем Xdebug успеет подключиться, если адаптер ещё не слушает.
- Запустите сессию:
- И только потом скрипт:
Что должно произойти¶
Xdebug подключается в начале запроса, адаптер принимает соединение, скрипт останавливается на строке 20.
Включать по требованию, а не всегда¶
start_with_request=yes заставляет каждый запуск PHP пытаться подключиться, что
шумно на машине, где вы запускаете и другие скрипты. Альтернатива — trigger:
Тогда отлаживаются только запуски с триггером:
Ни cwd, ни env, ни args¶
Адаптер ничего не запускает, поэтому к PHP эти поля профиля не применяются. Аргументы и окружение задавайте в той команде, которая стартует PHP:
Если не работает¶
| Симптом | Что делать |
|---|---|
| Скрипт отработал, ничего не остановилось | listener ещё не был поднят — сначала запускайте сессию |
| Не подключается вообще никогда | проверьте xdebug.mode=debug; сверьтесь через php -i \| grep xdebug |
| Порт занят | 9003 держит другой проект — задайте этому свой port |
| Останавливается без исходника | значит, вы всё-таки в контейнере — см. Отладка PHP в Docker |