如何让 xdebug/step-debugging 使用 ddev?
How do I get xdebug/step-debugging working with ddev?
我一直在我的 Drupal 项目中使用 ddev,现在想使用 xdebug,所以我使用 PhpStorm 进行逐步调试(或者任何 IDE 都可以)。但我似乎无法让它在断点处停止。我尝试按照 instructions in ddev docs 进行操作,但这并没有让我继续前进,而且我不知道下一步该怎么做。我做了:
- 按照此处讨论的那样设置 172.28.99.99 IP 地址
- 使用 config.yaml
xdebug_enabled: true
和 ddev start
启用了 xdebug(并使用 phpinfo 确认 xdebug 已启用。)
- 将 PHPStorm 置于 "listen for debug connections" 模式
在任何设置中调试 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)
我一直在我的 Drupal 项目中使用 ddev,现在想使用 xdebug,所以我使用 PhpStorm 进行逐步调试(或者任何 IDE 都可以)。但我似乎无法让它在断点处停止。我尝试按照 instructions in ddev docs 进行操作,但这并没有让我继续前进,而且我不知道下一步该怎么做。我做了:
- 按照此处讨论的那样设置 172.28.99.99 IP 地址
- 使用 config.yaml
xdebug_enabled: true
和ddev start
启用了 xdebug(并使用 phpinfo 确认 xdebug 已启用。) - 将 PHPStorm 置于 "listen for debug connections" 模式
在任何设置中调试 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)