我一直在我的 Drupal 项目上使用 ddev,现在想使用 xdebug,这样我就可以使用 PhpStorm 进行逐步调试(或者实际上任何 IDE 都可以)。但我似乎无法让它在断点处停止。我尝试按照 ddev 文档中的说明进行操作,但这并不能让我继续下去,而且我不知道下一步该做什么。我做到了:
按照此处讨论的方式设置 172.28.99.99 IP 地址xdebug_enabled: true
ddev start
启用 xdebug(并使用 phpinfo 检查以查看 xdebug 已启用。)将 PHPStorm 置于“侦听调试连接”模式首先,重读
ddev xdebug on
ddev xdebug off
,但也可以在 .ddev/config.yaml
中启用它。不要假设正在执行某些晦涩的代码片段并在那里放置断点。首先在 index.php 中的第一个可执行行处放置一个断点。哦,很多时候人们认为应该停止,但他们的代码没有被执行。ddev ssh
ping host.docker.internal
(并得到回复)吗?如果不能,则您的防火墙可能过于激进。在 PHPStorm 中,禁用“监听连接”按钮,这样它就不会监听。或者直接退出 PHPStorm。ddev ssh
telnet host.docker.internal 9003
可以连接吗?如果是这样,则说明您在端口 9003 上运行了其他程序,可能是 php-fpm。使用 lsof -i :9003 -sTCP:LISTEN
找出那里有什么并停止它,或者 更改 xdebug 端口并配置 PHPStorm 以使用新端口。在 telnet 命令无法连接之前不要继续。 现在单击 PHPStorm 上的监听按钮以开始监听连接。
ddev ssh
telnet host.docker.internal 9003
。它应该连接。如果没有,也许 PHPStorm 没有监听,或者没有配置为监听端口 9003?检查并确保 Xdebug 已启用。您可以在容器内使用 php -i | grep grep Xdebug
phpinfo()
的输出,包括 Drupal 的 admin/reports/status/php。您应该看到 with Xdebug <version>, Copyright (c) 2002-202x
并且 php -i | grep "xdebug.remote_enable"
应该给您 xdebug.remote_enable: On
。在项目的index.php的第一个相关行中设置断点,然后使用浏览器访问该站点。它应该停在那里。phpenmod -s fpm xdebug
,而不是运行
enable_xdebug
。来自 @mfrieling 的注释:如果您使用像 XDebug Helper 这样的浏览器扩展来设置 IDE 密钥,则该扩展必须与服务器上的相同。使用的 IDE 密钥必须与服务器、发送的浏览器扩展/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。
还值得一提的是
在 PHPStorm 中验证 xdebug 对于检查配置很有用。小心 Mac,因为它们可能正在运行 php-fpm。如果是这种情况,PHP Storm 将找不到连接(因为它已被 php-fpm 占用)。
lsof -i :9000 -sTCP:LISTEN
如果它返回类似 php-fpm 的内容,那么你就有这个问题了尝试关闭它(参见
PHP-FPM无法关闭
)。修复后运行它(可能会重新启动你的 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)
我遇到了一个问题,我使用站点的本地别名,但 Drush 假设我使用默认的 [sitename].ddev.site。由于我从未访问过该域,因此它从未提示零配置允许对话框,因此从未使用该域监听该端口。