Перейти к содержанию

Отладка PHP CLI

Отладить PHP-скрипт, который стартует, отрабатывает и завершается.

Предпосылки

  • php-dbgp-adapter в PATH:
make build
export PATH="$PWD/target/debug:$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 успеет подключиться, если адаптер ещё не слушает.

  1. Запустите сессию:
bugsaur gui --project . --break src/import.php:20
  1. И только потом скрипт:
php src/import.php

Что должно произойти

Xdebug подключается в начале запроса, адаптер принимает соединение, скрипт останавливается на строке 20.

Включать по требованию, а не всегда

start_with_request=yes заставляет каждый запуск PHP пытаться подключиться, что шумно на машине, где вы запускаете и другие скрипты. Альтернатива — trigger:

xdebug.start_with_request=trigger

Тогда отлаживаются только запуски с триггером:

XDEBUG_TRIGGER=1 php src/import.php

Ни cwd, ни env, ни args

Адаптер ничего не запускает, поэтому к PHP эти поля профиля не применяются. Аргументы и окружение задавайте в той команде, которая стартует PHP:

APP_ENV=dev php src/import.php --dry-run

Если не работает

Симптом Что делать
Скрипт отработал, ничего не остановилось listener ещё не был поднят — сначала запускайте сессию
Не подключается вообще никогда проверьте xdebug.mode=debug; сверьтесь через php -i \| grep xdebug
Порт занят 9003 держит другой проект — задайте этому свой port
Останавливается без исходника значит, вы всё-таки в контейнере — см. Отладка PHP в Docker