如何让 xdebug/step-debugging 使用 ddev?

How do I get xdebug/step-debugging working with ddev?

我一直在我的 Drupal 项目中使用 ddev,现在想使用 xdebug,所以我使用 PhpStorm 进行逐步调试(或者任何 IDE 都可以)。但我似乎无法让它在断点处停止。我尝试按照 instructions in ddev docs 进行操作,但这并没有让我继续前进,而且我不知道下一步该怎么做。我做了:

在任何设置中调试 xdebug 可能有点麻烦,但这里是要采取的步骤:

  • 首先,重读docs
  • 确保您拥有 2019+ 版本的 PHPStorm。许多高达 2018.3 和(包括?)2018.3 的 PHPStorm 版本与较新的 XDebug 版本不兼容。
  • 确保已启用xdebug;出于性能原因,默认情况下它是禁用的。大多数人在需要时使用 ddev exec enable_xdebug 启用它,用完后使用 ddev exec disable_xdebug,但也可以在 .ddev/config.yaml.
  • 中启用
  • 不要假设正在执行一些晦涩的代码并在那里放置断点。首先在 index.php 中的第一个可执行行放置一个断点。 Oh-so-many 次人们认为它应该停止,但他们的代码没有被执行。
  • ddev ssh 进入网络容器。你能ping host.docker.internal(并得到回应)吗?如果不能,您可能有 over-aggressive 防火墙。
  • 在 PHPStorm 中,禁用“侦听连接”按钮,这样它就不会侦听了。或者直接退出 PHPStorm。
  • ddev ssh: telnet host.docker.internal 9000 可以连接吗?如果是,则端口 9000 上还有其他东西 运行,可能是 php-fpm。使用 lsof -i :9000 -sTCP:LISTEN 找出那里有什么并停止它,或 change the xdebug port and configure PHPStorm to use the new one 。在您的 telnet 命令未连接之前不要继续。
  • 现在单击 PHPStorm 上的侦听按钮以启动它侦听连接。
  • ddev ssh 并再次尝试 telnet host.docker.internal 9000。它应该连接。如果没有,也许 PHPStorm 没有监听,或者没有配置为监听端口 9000?
  • 检查以确保 Xdebug 已启用。您可以在容器内使用 php -i | grep grep Xdebug,或使用任何其他您想要的技术来提供 phpinfo() 的输出,包括 Drupal 的 admin/reports/status/php。你应该看到 with Xdebug v2.9.6, Copyright (c) 2002-2020 php -i | grep "xdebug.remote_enable" 应该给你 xdebug.remote_enable: On.
  • 在你的项目index.php的第一个相关行设置断点,然后用浏览器访问该站点。它应该到此为止。

来自@heddn 的注释:如果你想让 xdebug 运行 只用于 fpm,例如 phpenmod -s fpm xdebug,而不是 运行 enable_xdebug.

@mfrieling 的注释:如果您使用像 XDebug Helper which sets an IDE key, that must be the same as on the server. Since DDEV 1.10.0 这样的浏览器扩展,“在 web 和数据库容器中会为您创建一个真实的用户,其中包含您的用户名和用户 ID”。 =66=] 默认情况下也用作 IDE 键。使用的 IDE 密钥在服务器上必须相同,浏览器 extension/cookie 发送和 PHPStorm。您可以通过使用以下两行创建文件 .ddev/php/xdebug.ini 来更改 DDEV 中的 IDE 键(将 PHPSTORM 替换为您要使用的值:

[XDebug]
xdebug.idekey = PHPSTORM

欢迎您的关注!

谢谢,遇到了同样的问题,添加文件 .ddev/docker-compose.xdebug.yaml 解决了问题。

但是,我 运行 在 Mac / OSX 上发现这些额外的步骤可以从容器内部发现内部主机的 IP 地址:

1.) 登录网页版ddev ssh

2.) 运行 ping docker.for.mac.localhost

3.) 在上面的yaml文件中为host.docker.internal设置返回的IP地址。

4.) 删除并启动 DDEV。

另外值得一提的是 validating xdebug 在 PHPStorm 中检查配置很有用。

小心使用 Mac,因为它们可能有 php-fpm 运行ning。如果是这种情况 PHP Storm 将找不到连接(因为它已经被 php-fpm 使用)。

看看是不是这样运行:

lsof -i :9000 -sTCP:LISTEN

如果它 returns 类似于 php-fpm,那么你有这个问题

尝试关闭它(参见 PHP-FPM can't be closed)。

运行 一旦你修复它(可能重新启动你的 mac)你应该看到这样的东西:

➜  solrpoc lsof -i :9000 -sTCP:LISTEN
COMMAND  PID             USER   FD   TYPE            DEVICE SIZE/OFF NODE NAME
phpstorm 512 alejandro.moreno  490u  IPv6 0xaf3eef0f3233a83      0t0  TCP *:cslistener (LISTEN)