【问题标题】:Xdebug inside Docker on Mac is not workingMac M1 2021 上 Docker 内的 Xdebug 无法正常工作
【发布时间】:2022-08-20 00:16:40
【问题描述】:

我将本地开发设置从 Linux 移植到新的 Mac 机器上,但在让 Xdebug 与 Mac M1 Pro 机器上的 PhpStorm 一起工作时遇到了问题。

我有一个装有 PHP 的容器,其中安装和配置了 Xdebug,如下所示:

zend_extension=/usr/lib/php8/modules/xdebug.so
xdebug.mode=debug

xdebug.idekey=PHPSTORM
xdebug.client_port=9001
xdebug.start_with_request=yes
xdebug.discover_client_host=1
xdebug.log=/var/log/xdebug.log

在 PhpStorm 中,我正在监听端口 9001(我将 9000 用于其他服务)。

这是 docker 容器中的 Xdebug 日志,地址为/var/log/xdebug.log

/var/www/html/app # tail -f /var/log/xdebug.log 
[49] [Step Debug] INFO: Checking header \'HTTP_X_FORWARDED_FOR\'.
[49] [Step Debug] INFO: Checking header \'REMOTE_ADDR\'.
[49] [Step Debug] INFO: Client host discovered through HTTP header, connecting to 172.18.0.4:9001.
[49] [Step Debug] WARN: Creating socket for \'172.18.0.4:9001\', poll success, but error: Operation in progress (29).
[49] [Step Debug] WARN: Could not connect to client host discovered through HTTP headers, connecting to configured address/port: localhost:9001. :-|
[49] [Step Debug] WARN: Creating socket for \'localhost:9001\', poll success, but error: Operation in progress (29).
[49] [Step Debug] WARN: Creating socket for \'localhost:9001\', connect: Address not available.
[49] [Step Debug] ERR: Could not connect to debugging client. Tried: 172.18.0.4:9001 (from REMOTE_ADDR HTTP header), localhost:9001 (fallback through xdebug.client_host/xdebug.client_port) :-(
[49] Log closed at 2022-03-15 16:28:46.957669

我不明白为什么连接没有发生/失败。

我还有一个docker-compose.yml 文件,上面的服务API 为

  api:
    build:
      context: .
    expose:
      - 8080
    container_name: api

我已经尝试了什么?

  1. 将 xdebug.ini 配置更改为使用远程主机 docker.for.mac.localhost,然后是 host.docker.internal,但没有成功。
  2. 已更改 start_with_request=trigger 而不是 yes
  3. 禁用 Mac 防火墙,认为 Docker 可能无法使用端口 9001。

    2022 年 8 月 19 日更新 - 这不适用于调试 cli 脚本(phpunit 测试)

    /etc/php8/conf.d/50_xdebug.ini的内容

                                                                                     
    zend_extension=/usr/lib/php8/modules/xdebug.so
    xdebug.mode=debug
    
    xdebug.idekey=PHPSTORM
    xdebug.client_port=9001
    xdebug.start_with_request=yes
    xdebug.discover_client_host=0
    xdebug.client_host=host.docker.internal
    xdebug.log=/var/log/xdebug.log
    
    ``
    
  • xdebug.discover_client_host=1 肯定不正确,您需要将其设置为 0。设置xdebug.client_host=host.docker.internal 应该是正确的,尝试使用它并显示日志。
  • @Derick 成功了!谢谢你。正如我之前在帖子中提到的,我只尝试设置 xdebug.client_host=host.docker.internal 并评论发现客户端主机。现在我明确设置 discover_client_host=0 并工作。怎么来的?您可以回答我选择作为答案,并请一些解释。我认为这个问题可能是我没有在 docker-compose.yaml 中绑定端口,打算尝试下一个端口:- 9001:9001

标签: docker macos phpstorm xdebug


【解决方案1】:

xdebug.discover_client_host=1 肯定不适合与 Docker 一起使用,您需要将其设置为 0。discover_client_host 使用 HTTP 标头查看请求的来源,但随着 NAT 与 Docker Xdebug(和 PHP)的关系,您会看到无法连接的 IP 地址或主机名。

使用 Docker 设置 xdebug.client_host=host.docker.internal 应该是正确的,这应该是网络网关地址,这也是你的主机。

(即使xdebug.discover_client_host=1,如果 Xdebug 无法连接到通过 HTTP 标头发现找到的不正确的设置,它也会退回到 xdebug.client_host 设置。)

如果您想查看更详细的日志,还可以添加xdebug.log_level=10,这应该可以提供更多信息。

对于 Xdebug,您不需要 docker-compose.yaml 中的“绑定端口”,因为 Xdebug 确实建立了连接IDE,因此不需要公开端口来接收连接。

【讨论】:

  • 嗨,一个很晚的回复,但这在调试 phpunit 测试期间对我不起作用。我在 2022 年 8 月 19 日的最后一节更新中更新了问题
猜你喜欢
  • 2021-11-03
  • 1970-01-01
  • 1970-01-01
  • 2022-07-27
  • 1970-01-01
  • 2021-10-12
  • 2019-09-03
  • 2019-02-26
  • 1970-01-01
相关资源
最近更新 更多