Mac 上 Docker 内的 Xdebug 无法工作

2024-04-24

我将本地开发设置从 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, then host.docker.internal但没有成功。
  2. Changed start_with_request=trigger代替yes.
  3. 禁用 Mac 防火墙,认为端口 9001 可能无法被 Docker 使用。

2022 年 8 月 19 日更新 - 这无法调试 cli 脚本(phpunit 测试)

下面提供的配置答案是通过 HTTP 请求工作的,但不适用于 phpunit 测试或 cli 脚本。

内容/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: [Step Debug] Could not connect to debugging client. Tried: 172.18.0.1:9001 (through xdebug.client_host/xdebug.client_port) :-(

当我的编辑器 PhpStorm 尝试运行这个时

[sshConfig://[email protected] /cdn-cgi/l/email-protection:2023]:/usr/bin/php -dxdebug.mode=debug -dxdebug.client_port=9001 -dxdebug.client_host=172.18.0.1 /var/www/html/app/vendor/phpunit/phpunit/phpunit --configuration /var/www/html/app/phpunit.xml --filter "/(Tests\\Unit\\App\\Services\\Maps\\GoogleMapsServiceTest::testGetPlaceFromId)( .*)?$/" --test-suffix GoogleMapsServiceTest.php /var/www/html/app/tests/unit/app/Services/Maps --teamcity

还有 docker 机器内的 /var/log/xdebug.log 日志

[326] [Step Debug] INFO: Connecting to configured address/port: 172.18.0.1:9001.
[326] [Step Debug] WARN: Creating socket for '172.18.0.1:9001', poll success, but error: Operation in progress (29).
[326] [Step Debug] ERR: Could not connect to debugging client. Tried: 172.18.0.1:9001 (through xdebug.client_host/xdebug.client_port) :-(
[326] Log closed at 2022-08-19 16:24:59.855397

我通过修改 phpunit 解释器配置以一种 hacky 的方式解决了这个问题。我不知道为什么/etc/php8/conf.d/50_xdebug.ini在这种情况下,设置为内部 docker 主机的值被忽略


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

Setting xdebug.client_host=host.docker.internalDocker 应该是正确的,这应该是网络网关地址,这也是你的主机的地址。

(即使xdebug.discover_client_host=1,因为 Xdebug 将回退到xdebug.client_host如果无法连接到通过 HTTP 标头发现发现的不正确的标头,请进行设置。)

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mac 上 Docker 内的 Xdebug 无法工作 的相关文章

随机推荐

  • 使用 FileSystemWatcher 从文件中获取新行

    我正在观看一个包含以下代码的文件 FileSystemWatcher watcher new FileSystemWatcher watcher Path C watcher Filter t log watcher Changed new
  • matlab中的分箱

    我一直无法在 matlab 或 Octave 中找到函数来完成我想要的操作 我有一个两列的矩阵 m x 和 y 值 我知道我可以通过执行 m 1 或 m 2 来提取列 我想将其分成 可能 大小相等的较小矩阵 并绘制这些矩阵的平均值 换句话说
  • 替换sql server 2000中的ntext(超过4000个字符)

    如何替换sql server 2000中ntext列中超过4000个字符的文本 转换为 nvarchar max 不起作用 因为它会截断值 使用 TEXT NTEXT 是一团糟 这是尽快摆脱这些字段的众多原因之一 您需要使用 READTEX
  • 如何在Linux内核中启用CONFIG_PREEMPT选项?

    我是 Linux 内核编程的新手 尝试在 x86 64 上使用旧内核 Linux 2 6 32 我想启用其中的 CONFIG PREEMPT 选项 但找不到有关如何执行此操作的信息 我可以使用我的首选选项编译新内核 但不知道在这种情况下我需
  • 如何在没有 JoinTables 的 JPA 中创建一对多关系?

    我正在尝试使用以下表结构在 JPA 中创建 OneToMany 关系 CATALOG catalogId PK name PRODUCT productId PK name catalogId FK 我将类定义为 Entity public
  • Neo4j - 计算带有标签的节点

    我想要一个查询来计算数据集中有多少个节点具有每个标签 例如 标签A 100 标签B 200 我可以为每个单独的标签执行此操作 例如 MATCH n LabelA return count n 但是 我想在一个命令中为每个标签执行此操作 尝试
  • 普通的 console.warn() 显示在日志中,并带有服务器性“错误”

    当我记录一些东西时console warn 它似乎出现在 Stackdriver 日志中 严重性为 错误 Stackdriver 错误报告不显示这些错误 因此它们似乎不被视为错误 这使得无法过滤日志以仅显示错误 读取 Stackdriver
  • iFrame 中的 Angular2 不安全资源 URL 与 DomSanitationService

    背景 我正在为我们正在研究的过渡策略进行概念验证 该策略将在我们致力于将现有功能转换为 Angular 的同时将 旧 Web 应用程序引入 iFrame Issue 我遇到的问题是尝试在 iFrame 上设置 src 标记 我正在尝试使用
  • REST 何时/如何取代 SOAP [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我目前正在写关于 IT 技术等的论文
  • 如何在php中检查来自其他网站的cookie并不允许访问我的网站?

    如何在php中检查来自其他网站的cookie并不允许访问我的网站 如果客户端有 cookie 示例 如果有来自 www example com 的 cookie 它会被重定向到其他网站吗 请帮助我其他网站上的一些人对我的不良网站发表评论 我
  • Android - 将 ProgressBar 设置为垂直条而不是水平条?

    我正在尝试使用 ProgressBar 作为类似计量的显示 我认为这将是一个简单的任务 并认为 ProgressBar 有一个属性可以设置为垂直 但我没有看到任何东西 此外 我希望能够在栏的侧面显示类似标尺的指示器 以清楚地指示当前级别 感
  • 在 Linux 中生成相同的数字,但在 Windows 中则不然

    下面的代码旨在生成区间 1 100 中的五个伪随机数的列表 我播种default random engine with time 0 它返回系统时间UNIX时间 https en wikipedia org wiki Unix time 当
  • 与 Post 进行交叉呼叫,但在飞行前失败

    我必须从我的网站向第三方域 服务器进行网络服务调用 当我使用 jQuery Ajax by Post 方法和 content type text plain 进行此调用时 它工作正常 但是 当我将其更改为 content type text
  • 如何隐藏 WPF ListView 的标头?

    我希望能够隐藏 WPF ListView 中每个网格列顶部的标题 这是我的 ListView 的 XAML
  • 在同一 URL 上运行 SOAP 和 RESTful

    假设我们有一个响应主机标头 kebab shop intra net 的网站 此 URL 中是否可以同时包含 SOAP 和 RESTful 也就是说 这两者都是在已部署的代码中处理的 kebab shop intra net takeawa
  • 在我的绘画程序中绘制矩形时出现错误

    public partial class Form1 Form Point downPoint upPoint List
  • iPhone HTML5 音频标签不起作用

    我遇到了音频标签无法在 iPonhe 上工作的问题 在 W3Schools 网站上测试时它可以播放 HTML5 音频标签 但不适用于我下面的网站
  • 使用 awk 添加列。这个 awk 命令有什么问题?

    我想将两列添加到大约 10 000 列的文件中 我想在每行插入 nr 22 作为第一列 然后我想要将原始第一列作为第二列 然后作为第三列我想要插入第 nr NR 行 之后我想要打印其余的原始列 我想我可以用下面的 awk 行来做到这一点 a
  • Google 地图 API - 添加多个目的地不起作用(谷歌方向)

    我在创建 复制谷歌地图方向功能时遇到问题 当我有 从 到 字段时 我可以让它正常工作 但一旦我尝试添加多个目的地 它就不起作用 我看过我们 但我没有得到任何很好的示例教程来展示这是如何完成的 以下是我到目前为止所做的事情 但我很确定这件事做
  • Mac 上 Docker 内的 Xdebug 无法工作

    我将本地开发设置从 Linux 移植到新的 Mac 机器 但在让 Xdebug 在 Mac M1 Pro 机器中与 PhpStorm 配合使用时遇到问题 我有一个包含 PHP 的容器 其中 Xdebug 安装并配置如下 zend exten