Phpstorm 如何使用ddev进行xdebug/step调试?

Phpstorm 如何使用ddev进行xdebug/step调试?,phpstorm,xdebug,ddev,Phpstorm,Xdebug,Ddev,我一直在Drupal项目中使用ddev,现在我想使用xdebug,因此我可以逐步调试PhpStorm(或者任何IDE都可以)。但我似乎无法让它在断点处停止。我试着跟着他们走,但这并不能让我走,我不知道下一步该怎么办。我做到了: 按此处所述设置172.28.99.99 IP地址 使用config.yamlxdebug\u Enabled:true和ddev start(并使用phpinfo检查xdebug是否已启用。) 将PHPStorm置于“侦听调试连接”模式 在任何设置中调试xdebug都可

我一直在Drupal项目中使用ddev,现在我想使用xdebug,因此我可以逐步调试PhpStorm(或者任何IDE都可以)。但我似乎无法让它在断点处停止。我试着跟着他们走,但这并不能让我走,我不知道下一步该怎么办。我做到了:

  • 按此处所述设置172.28.99.99 IP地址
  • 使用config.yaml
    xdebug\u Enabled:true
    ddev start
    (并使用phpinfo检查xdebug是否已启用。)
  • 将PHPStorm置于“侦听调试连接”模式

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

  • 首先,重读这本书
  • 确保您拥有2019+版本的PHPStorm。2018.3之前和(包括?)的许多PHPStorm版本与较新的XDebug版本不兼容
  • 确保xdebug已启用;出于性能原因,默认情况下会禁用它。大多数人使用
    ddev exec ENABLExdebug
    在需要时启用它,使用完后使用
    ddev exec ENABLExdebug
    禁用它,但也可以在
    .ddev/config.yaml
    中启用它
  • 不要假设正在执行某段模糊的代码,并在那里设置断点。首先在index.php中的第一个可执行行中放置一个断点。很多时候人们认为应该停止,但是他们的代码没有被执行
  • ddev ssh
    插入web容器。您能否
    ping host.docker.internal
    (并获得响应)?如果你不能,你可能有一个过度攻击的防火墙
  • 在PHPStorm中,禁用“侦听连接”按钮,使其无法侦听。或者干脆退出PHPStorm
  • ddev ssh
    :是否可以
    telnet host.docker.internal 9000
    连接?如果是这样,那么在端口9000上运行的可能是php fpm。使用
    lsof-i:9000-sTCP:LISTEN
    找出并停止它,或者。在telnet命令未连接之前不要继续
  • 现在单击PHPStorm上的“侦听”按钮,开始侦听连接
  • ddev ssh
    并重试
    telnet host.docker.internal 9000
    。它应该连接起来。如果不是,可能PHPStorm没有侦听,或者没有配置为侦听端口9000
  • 检查以确保Xdebug已启用。您可以在容器中使用
    php-i | grep grep Xdebug
    ,或者使用任何其他您想要的技术来提供
    phpinfo()
    的输出,包括Drupal的admin/reports/status/php。使用Xdebug v2.9.6,您应该看到
    ,版权所有(c)2002-2020
    php-i | grep“Xdebug.remote_enable”
    应该为您提供
    Xdebug.remote_enable:On
  • 在项目index.php的第一个相关行中设置断点,然后使用浏览器访问站点。应该到此为止
@heddn的一个注意事项:如果您只想让xdebug为fpm运行,例如,
phpenmod-s fpm xdebug
,而不是运行
enable\u xdebug

@mfrieling的一个注意事项:如果您使用类似的浏览器扩展来设置IDE密钥,则必须与服务器上的相同。因为“在web和db容器中为您创建了一个真实的用户,使用您的用户名和用户ID”,默认情况下,该用户名和用户ID也用作IDE密钥。服务器上使用的IDE密钥、已发送的浏览器扩展名/cookie和PHPStorm必须相同。您可以通过以下两行创建文件
.DDEV/php/xdebug.ini
来更改DDEV中的IDE键(将
PHPSTORM
替换为您想要使用的值):

[XDebug]
xdebug.idekey = PHPSTORM

欢迎您在此进行后续操作!

谢谢,您也遇到了同样的问题,添加了文件
.ddev/docker compose.xdebug.yaml
解决了这个问题

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

1.)登录web continaner
ddev ssh

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

3.)在上述yaml文件中设置主机.docker.internal的返回IP地址

4.)卸下并启动DDEV


同样值得一提的是,在PHPStorm中,检查配置非常有用。

Collect xdebug log——只有这样,您才能看到正在发生的事情。docker.for.mac.localhost应该与host.docker.internal相同,这是docker提供该地址的旧方法。在当前版本的Docker for Mac和ddev中,您不应该做任何这些事情。非常适合调试!我遵循了所有的步骤,但仍然存在问题,结果发现xdebug在PHP7.3上还不能正常运行,所以我将我的ddev配置降低到了7.2,它工作了OOTB!应该在某处记录的想法:感谢伟大的调试步骤。在我的例子中,
ping host.docker.internal
的步骤失败了,解决方案不是一个过于激进的防火墙,而是这一个:使用Mac和最新的docker for Mac、DDEV和PhpStorm版本。