Про xdebug могу сказать, что вы скорее всего что-то не так готовите. Важно понимать, что сам xdebug является по сути клиентом, который отправляет данные дебаг-серверу (в данном случае его поднимает PHPStorm). Исходя из этого можно с уверенностью заявить, что в docker-compose вообще ничего, связанного с дебагом быть не должно (максимум сюда можно отнести проброс папки vendor, если вам нужно в дебаге проходить по подгруженным композером библиотекам).
Как работает xdebug: вы открываете в браузере страницу, php начинает её обрабатывать, xdebug смотрит в свой конфиг и, если видит инфу для подключения (адрес и порт дебаг-сервера), то подключается к нему, узнаёт о брейкпоинтах и дальше они между собой взаимодействуют, но подключение поднимает php, то есть оно идет из контейнера на хост, никакие порты при этом пробрасывать не нужно, так как из контейнера ваш хост всегда видно.
Я ставлю в конфиге
xdebug.remote_connect_back=on
, тогда не нужно указывать
xdebug.remote_host
и он ищет сервер на ip, с которого открыли страницу. Правда так не подебажишь cli, но ip-шник хоста тоже можно как-то достать, можете погуглить, если очень хочется.
Допустим, у вас в xdebug.ini написано следующее:
zend_extension=xdebug.so
xdebug.remote_enable=on
xdebug.remote_autostart=on
xdebug.remote_connect_back=on
xdebug.remote_port=9999
Тогда в PHPStorm достаточно:
Settings > Languages & Frameworks > PHP > Debug
В разделе Xdebug указать порт 9999 и поставить галку на
Can accept external connections.
В самом низу, в
Advanced settings
убрать галку с
Notify if debug session was finished without being pausedSettings > Languages & Frameworks > PHP > Servers
Добавить сервер:
Name и
Host указать из
server_name
nginx (с другими прокси не настраивал)
Port тоже из конфига nginx, а не тот, что пробрасывается наружу!
Эти данные php берет от своей прокси внутри контейнера и передаёт при поднятии сессии дебага, так что, если неправильно указать, Path mapping не заработает.
Галочка на
Use path mappings и поставить в соответствие папке проекта абсолютный путь внутри контейнера
Также на всякий случай и для сравнения инструкция для VSCode:
Установить расширение PHP Debug и добавить в конфигурацию дебага следующее
{
"name": "Listen for XDebug in Docker",
"type": "php",
"request": "launch",
"port": 9999,
"pathMappings": {
"Абсолютный путь к папке проекта в контейнере": "${workspaceRoot}"
}
}
Это дело у меня прекрасно работает и из под винды со старой docker-machine, и "огромным бубном" я бы это не называл...