php - 如何设置 VSCode、PHP 调试和 XDebug (Windows 10)
问题描述
我想使用 VSCode 的“PHP Debug”插件和 Xdebug 来调试 PHP 脚本。
但是当我选择“调试|开始调试 F5”时,会出现小调试弹出窗口,我被卡住了。暂停、重新启动、停止按钮处于活动状态。Step over, into, out 按钮处于非活动状态(灰显)。调试控制台中没有任何反应。
(1) 安装VSCode 1.42.1
(2) XAMPP v3.2.4 启动并运行
(3) 使用向导安装 Xdebug 并粘贴我的 phpinfo() 数据以确定正确的版本。当我从 XAMPP 控制面板启动 'admin' 并查看 phpinfo 时,浏览器会显示我(以及许多其他内容):
[...]
This program makes use of the Zend Scripting Language Engine:
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
[...]
(4)php.ini
有
[XDEBUG]
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.show_local_vars = 1
xdebug.remote_log = "C:\Program Files_\xampp\php\logs\xdebug.log"
zend_extension = "php_xdebug-2.9.2-7.4-vc15-x86_64.dll"
(请注意“Program Files_”不是受保护的“Program Files”目录,XAMPP 具有写访问权限,如下面的第(9)点所示)
(5) Windows 路径C:\Program Files_\xampp\php;
中有
(6) 当我在 VSCode 中使用 Code Runner 扩展运行“Hello World.php”脚本时运行良好
(7)launch.json
对于 VSCode 调试器有
"configurations": [
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000
},
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9000,
}
]
(8) 我的 Windows 防火墙有一个入站规则,允许端口 9000 上的 TCP 流量。
(9) 当我刚刚运行代码时,xdebug.log(请参阅php.ini
)更新为
[94396] Log opened at 2020-03-08 07:45:28
[94396] I: Connecting to configured address/port: localhost:9000.
[94396] E: Time-out connecting to client (Waited: 200 ms). :-(
[94396] Log closed at 2020-03-08 07:45:28
但是当我使用“调试|开始调试 F5”时,xdebug.log 中没有任何反应。
到目前为止,这就是我认为相关的所有信息。这让我像这样:
me -> update_status("at wit's end")
你们那里的巫师知道在哪里挖吗?要调整哪个配置文件?要查阅哪个日志文件?
脚注:在 VSCode 中调试 Python 脚本的工作与预期一样。
解决方案
@LazyOne 的评论提供了偶然发现解决方案的线索和工具......
事实证明,答案相当尴尬。
长话短说(如何检查 VSCode 是否正在侦听端口 9000)
- 启动 XAMPP,启动 VSCode
- 打开你的 php 脚本
- 设置断点
- 打开一个 Linux shell(我在 Windows 上的 Ubuntu 上使用 Bash)
- 在shell中运行
telnet 0.0.0.0 9000
或telnet localhost 9000
观察连接失败
root ~ $ telnet localhost 9000
Trying 127.0.0.1...
telnet: Unable to connect to remote host: Connection refused
root ~ $ telnet 0.0.0.0 9000
Trying 0.0.0.0...
telnet: Unable to connect to remote host: Connection refused
- 开始调试并看到如上所述的冻结调试弹出窗口
- 运行
telnet 0.0.0.0 9000
或telnet localhost 9000
在 shell 中运行并注意区别:您已连接到 VScode!
root ~ $ telnet 0.0.0.0 9000
Trying 0.0.0.0...
Connected to 0.0.0.0.
Escape character is '^]'.
- 单击冻结的调试弹出窗口上的停止按钮并在外壳中观察
stop -i 1 Connection closed by foreign host.
root ~ $
得出结论,VSCode 确实在监听 0.0.0.0:9000 和 localhost:9000。
- 挠头,回到 VSCode
- 开始调试
- 注意底部的橙色状态栏,上面写着“Listen to XDebug”
- 注意菜单栏下方的下拉菜单,上面写着“绿色箭头”和“监听 XDebug”
- 探索下拉菜单并(重新)发现第二个配置“启动当前打开的脚本”,意识到/记住您
launch.json
有 2 个配置 - 选择“启动当前打开的脚本”时单击绿色箭头,看到沿着“listen EARDRINUSE: address already in use :::9000”行弹出错误
- 取消错误提示,点击调试弹窗的停止按钮停止调试,注意底部菜单栏变为蓝色
- 当下拉菜单中再次显示“启动当前打开的脚本”时单击绿色箭头...并注意调试按预期开始
- 麾!赞扬@LazyOne 的帮助!感谢上天赐予 stackoverflow 社区!
- “Listen for XDebug”配置
launch.json
用于调试从浏览器会话启动的脚本:(i)在 VSCode 中设置断点,(ii)使用“Listen for XDebug”配置开始调试,(iii)启动脚本通过在浏览器中发起请求,(iv) 观察 VSCode 是否在处理请求时触发断点
短篇故事
当您开始在 VSCode 中调试 php 脚本时,请确保选择“启动当前打开的脚本”作为配置,请参见下面的屏幕截图。
事后诸葛亮
我已经改变launch.json
了
"configurations": [
{
"name": "Launch currently open script",
"type": "php",
"request": "launch",
"program": "${file}",
"cwd": "${fileDirname}",
"port": 9000
},
{
"name": "Listen for XDebug",
"type": "php",
"request": "launch",
"port": 9000
}
]
这样,“启动当前打开的脚本”是默认设置,当我使用主菜单中的“调试|开始调试 F5”开始调试时将使用该脚本。
推荐阅读
- symfony - 验证组不适用于集合类型
- azure - 如何将参数传递给 Azure 数据工厂中的管道?
- sql-server - 消息 8152,级别 16,状态 10 上 Like where 子句
- c++ - 在被重新分配的类的构造函数中使用变量的地址
- jms - Apache ActiveMQ Artemis Netty 客户端通过 HTTP 代理发送消息
- c# - asp.net 如何变成 MVC 或 WebApi?
- excel - Laravel Excel Maatwebsite 的索引列
- php - 当文件不存在时抑制 PHP filemtime() 错误
- swift - 无法使用带有 unicode 字符的电子邮件正则表达式找到匹配项
- azure - APIM 的条件 ARM 模板部署:只创建,不更新