不在断点处停止的可能原因:
- IDE 拒绝来自远程服务器的调试连接请求。为了避免这种情况,电话图标必须是绿色的(运行 -> 开始监听 PHP 调试连接)。
- 所有断点都被静音。关闭断点静音。
- 未选中特定断点的暂停复选框。在Run -> View Breakpoints中一一检查它们。打勾的意思是“暂停执行”,而不是人们可能认为的“暂停断点”。(我使用的当前版本的 PHPStorm 似乎有问题,如果我选中Suspend复选框,那么它还没有生效。我必须单击另一个断点,然后单击返回以“提交”选中复选框。)
- 如果要调试从浏览器调用的脚本,则浏览器应使用 idekey 的值设置一个名为 XDEBUG_SESSION 的 cookie。您可以通过以下方式扩展 URL 来启动它:http://192.168.99.100/?XDEBUG_SESSION_START=PHPStorm。请注意 cookie 的到期时间仅为一小时。有一些有用的浏览器插件可以轻松处理调试器 cookie。有关更多信息,请参阅https://xdebug.org/docs/remote#starting。
- 单个断点未启用。在Run -> View Breakpoints中一一检查它们。
- 单个断点有一些不满足的条件。检查Run -> View Breakpoints中断点的Condition设置。
- 远程服务器和 IDE 之间存在一些映射问题。当您在 IDE 中设置断点时,它会向远程服务器发送执行应在 F 文件的第 N 行停止的信息。您的本地文件和远程服务器上的文件之间存在映射。映射在 IDE 中的以下位置定义:
- 在Preferences -> Languages & Frameworks -> PHP页面的路径映射字段上
- 在首选项 -> 语言和框架 -> PHP -> 服务器页面上
如果这些映射不正确,例如本地的F1.php不小心映射到了远程的F2.php,那么你可能会遇到问题。如果您在本地文件F1.php的第 #N 行设置断点,则只有在执行到达文件F2.php的第 #N 行(而不是F1.php的行)时,服务器才会停止执行。如果这是问题所在,那么如果您打开Run -> Break at first line in PHP scripts标志,您仍然可以调试代码。请注意开发操作系统的目录和文件名与远程服务器的不同区分大小写!
- 由于某些网络设置问题,IDE 未从远程服务器接收调试连接请求。检查Preferences -> Languages & Frameworks -> PHP -> Debug页面是否 IDE 正在为 XDebug 监听端口 9000,检查它是否可以接受外部连接,等等。
- 远程服务器的 XDEBUG 相关设置不正确。我在 php.ini 中使用以下设置
.
xdebug.default_enable = 1
xdebug.remote_enable = 1
xdebug.remote_connect_back = 0
xdebug.idekey = "PHPStorm"
xdebug.remote_autostart = 1
xdebug.remote_host=192.168.1.26
您应该将remote_host设置为您的开发计算机的 IP 地址,或者如果您的服务器位于localhost上,则可以省略整行。
另外,我设置了以下环境变量:
export PHP_IDE_CONFIG="serverName=halmaiXdebug"
export XDEBUG_CONFIG="idekey=PHPStorm"
其中serverName的值是我在 IDE的Preferences -> Languages & Frameworks -> PHP -> Servers页面上定义的服务器名称。
更新:太旧的 PhpStorm 版本也可能导致断点问题。使用服务器上的 PHP 7.4 和本地的 PhpStorm 2018.2,执行在第一条指令处停止,但在任何其他指令处都没有。升级到较新的 PhpStorm 版本 (2020.1) 后,它可以按预期工作。