Я уже немного писал о NetBeans тут . Данная IDE умеет хорошо дружить с Xdebug, в связке с которым очень удобно отлаживать php-код. Основы успешно описаны, например, здесь.
Все интереснее, когда код приходится отлаживать не на локальной машине, а внутри docker-контейнера. Особенно, если нужно отладить cli-скрипт внутри контейнера.
Для успешной отладки следует:
- Настроить docker-контейнер с Xdebug внутри;
- Настроить Xdebug внутри контейнера;
- Настроить NetBeans.
При обычной отладке с использованием браузера и при отладке cli-скрипта настройки будут слегка отличаться. Итак, поехали.
Настройка контейнера
Установку Xdebug внутрь контейнера мы обсуждать не будем. Эти настройки можно найти, например, тут.
Интереснее настройки самого Xdebug.
В случае с обычной отладкой:
xdebug.remote_enable=1
xdebug.remote_connect_back=1
xdebug.idekey=netbeans-xdebug
Расшифровка:
xdebug.remote_enable
— разрешает удаленную отладку.xdebug.remote_connect_back
— автоматическое установление соединения с хостом, который иницирует удаленную отладку. Если не указывать эту опцию, то нужно использоватьxdebug.remote_host
, где следует указать ip вашего хоста из виртуального docker-адаптера.xdebug.idekey
— ключ для соединения. Значениеnetbeans-xdebug
задано в NetBeans по умолчанию. Можно не задавать эту опцию и использоватьxdebug.remote_autostart=1
, но тогда Xdebug будет стартовать в каждом скрипте, даже если это не нужно, что скажется на производительности.
Настройка NetBeans
Для успешной отладки NetBeans должен знать как сопоставить между собой пути внутри docker-контейнера и пути в хостовой машине.
Идем в Свойства проекта, далее Выполнить настройку → Дополнительно. Внизу в разделе Отображение пути добавляем наше сопоставление.
Теперь, если запустить отладку проекта, то отладчик должен автоматически остановить выполнение на первой строке скрипта точки входа в приложение (если активирована соответствующая настройка в IDE).
Если ничего не произошло и вас отключена опция NetBeans Остановить в первой строчке, то удостоверьтесь, что поставили breakpoint где-то по пути выполнения скрипта. Если ни одного breakpoint не установлено, то следует установить его, остановить отладку и запустить снова.
Отладка cli-скрипта
Для отладки cli-скрипта все немного иначе. Главное отличие в том, что опция xdebug.remote_connect_back=1
нам не нужна, ведь соединения от хостовой машины не будет. Вместо этого NetBeans будет ожидать обращений от приложения.
Для начала настроим NetBeans.
Идем по уже известному пути Свойства проекта → Выполнить настройку. Здесь добавляем новую конфигурацию, нажав Создать…. Далее жмем Дополнительно и указываем опцию Не открывать браузер.
После настройки, кликаем правой кнопкой по проекту, выбираем Установить конфигурацию и задаем вариант, который только что создали.
Теперь можно нажать Отладка проекта или просто Ctrl+F5. Браузер не должен открыться.
Идем в меню Окно → IDE и сервис → Терминал. В появившемся терминале выполняем вход в docker-контейнер, выполнив что-то вроде:
$ docker exec -ti %container_id% bash
%container_id% в данном случае id контейнера с вашим приложением.
Теперь самое интересное. Выполняем:
$ export XDEBUG_CONFIG="remote_enable=1 remote_mode=req remote_port=9000 remote_host=%remote_host_ip% remote_connect_back=0 idekey=netbeans-xdebug"
Обратите внимание на указанный remote_host. Именно по этому адресу Xdebug будет ломиться в отладчик. Проставьте свое значение на место %remote_host_ip%.
Теперь можно запустить какой-нибудь cli-скрипт. Например, миграции yii:
$ ./yii migrate
Если отладчик NetBeans запущен, то он должен отловить это событие и прервать выполнение на первой строке скрипта точки входа.