惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
V
V2EX
大猫的无限游戏
大猫的无限游戏
腾讯CDC
博客园 - Franky
WordPress大学
WordPress大学
Jina AI
Jina AI
GbyAI
GbyAI
云风的 BLOG
云风的 BLOG
B
Blog RSS Feed
Last Week in AI
Last Week in AI
The Cloudflare Blog
V
Visual Studio Blog
P
Proofpoint News Feed
博客园 - 叶小钗
L
LangChain Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Recorded Future
Recorded Future
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
人人都是产品经理
人人都是产品经理
Y
Y Combinator Blog
罗磊的独立博客
雷峰网
雷峰网
博客园 - 【当耐特】
Microsoft Security Blog
Microsoft Security Blog
L
LINUX DO - 热门话题
Cisco Talos Blog
Cisco Talos Blog
L
Lohrmann on Cybersecurity
Martin Fowler
Martin Fowler
Spread Privacy
Spread Privacy
MongoDB | Blog
MongoDB | Blog
Engineering at Meta
Engineering at Meta
C
Cybersecurity and Infrastructure Security Agency CISA
小众软件
小众软件
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Recent Announcements
Recent Announcements
T
Threat Research - Cisco Blogs
Security Archives - TechRepublic
Security Archives - TechRepublic
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
宝玉的分享
宝玉的分享
D
DataBreaches.Net
T
The Exploit Database - CXSecurity.com
Vercel News
Vercel News
IT之家
IT之家
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
T
Troy Hunt's Blog
aimingoo的专栏
aimingoo的专栏

f2h2h1's blog

使用yii3实现一个微框架 claw养殖技术 计算机网络基础知识 定时任务 ACME的使用经验 magento2加上varnish缓存 开发Magento2的模块 在magento2中使用persisted-query socket编程 一些开发笔记 一段CSDN文章主要内容的油猴脚本 电子邮件的不完整总结 git的笔记 在Windows下配置PHP服务器 终端,控制台和外壳 PHP各种运行方式的不完整总结 把网页导出成PDF 和颜色相关的笔记 HTTP认证方式的不完整总结 SEO的经验 密码学入门简明指南 文件的上传和下载 用纯CSS3实现的滑动按钮 Linux的GUI 关于字符编码的一些坑 nc的使用和原理 在Windows下安装Magento2 对JS原型链的理解 使用docker-compose部署magento2 浏览器和服务器通讯方式的不完整总结 观察网站性能 一些关于Linux的笔记 telnet的不完整总结 在Windows下安装pear MySQL的时间类型和时间相关的函数 Windows下通过PEB读取进程的环境变量 关于 在VSCode里使用Xdebug远程调试PHP 在Windows下搭建git服务 关于环境变量的不完整总结 使用shell实现的kv数据库 如何完成以xx管理系统为选题的毕业设计 数字号码资源 各种标记语言 使用PowerShell实现的http服务器 kind相关经验 DNSSEC简介 nginx+ffmpeg+websocket实现的直播例子 使用Tesseract识别字符验证码 使用docker部署nuxt FirstData后台的设置 paypal,firtdata,支付宝的不完整接入指南 微信支付的不完整接入指南 用docker-compose部署lnmp环境 mongodb分片 练习
在VSCode里调试PHP
2025-04-22 · via f2h2h1's blog

这篇文章最后更新的时间在六个月之前,文章所叙述的内容可能已经失效,请谨慎参考!

1 下载对应版本的 Xdebug

  1. 在命令行里运行
    php -i
    // 又或者运行这句
    php -r 'phpinfo();'
    
  2. 打开这个网址 https://xdebug.org/wizard.php 把第一步输出的结果复制进去,然后获得对应版本 Xdebug 的下载地址,当然如果你知道熟悉 PHP 的版本也可以直接选择相应的版本下载
  3. 解压下载后的压缩包,把 Xdebug 的拓展复制进 PHP 的拓展目录里,PHP 的拓展目录一般是安装目录里的 ext 文件夹

2 修改 php.ini

在 php.ini 的最后加上以下内容

  • xdebug 2.9
    [Xdebug]
    ; xdebug 拓展的 so 或 dll 的路径,这里最好填绝对路径
    zend_extension = path/to/xdebug
    ; 日志路径
    ; xdebug.remote_log = ""
    ; 是否开启远程调试
    xdebug.remote_enable = on
    ; 允许调试的客户端IP
    xdebug.remote_host = 127.0.0.1
    ; 远程调试的端口
    xdebug.remote_port = 9003
    ; 开启远程调试自动启动
    ; xdebug.remote_autostart = on
    ; 显示局部变量
    xdebug.show_local_vars = on
    ; 显示默认的错误信息
    xdebug.default_enable = on
    ; ide key
    xdebug.idekey = "vscode"
    ; 是否开启分析器
    ; xdebug.profiler_enable = on
    ; 分析器文件路径
    ; profiler_output_dir = ""
    ; 启用 trace
    ; xdebug.auto_trace = 1
    ; 跟踪输出路径
    ; xdebug.trace_output_dir = ""
    ; 当这个设置设为其他不等于 0 的值时,Xdebug 会生成易于人类阅读的跟踪文件
    ; xdebug.show_mem_delta = 1
    ; trace 输出的格式 0 文本文件, 1 有格式的文本文件, 2 html
    ; xdebug.trace_format = 0
    ; 参数信息显示 0 不记录, 1 类型和数量, 2 类型和数量并附带提示信息, 3 完整变量内容, 4 完整变量内容和名称, 5 序列化变量内容
    ; xdebug.collect_params = 1
    ; 是否应该将函数调用的返回值写入跟踪文件
    ; xdebug.collect_return = On
    
  • xdebug 3.0
    [Xdebug]
    zend_extension = path/to/xdebug
    xdebug.mode = "debug"
    xdebug.idekey = "vscode"
    xdebug.client_host = 127.0.0.1
    xdebug.client_port = 9003
    xdebug.connect_timeout_ms = 2000
    xdebug.start_with_request = "trigger"
    

2.9 配置参考文档

3 安装 VSCode 的 PHP 拓展包

在 VSCode 的拓展里搜索对应的插件名然后选择安装即可。

IntelliSense 的插件有两个, IntelliSense 只需要装一个就可以的了,笔者更喜欢用 PHP Intelephense 。

4 在 VSCode 里设置 Xdebug

  1. 使用 VSCode 以打开文件的方式,打开需要调试的 PHP 项目所在的文件夹
  2. 在 VSCode 里选择调试,然后选添加配置,然后选 PHP
  3. 这时 VSCode 会在 launch.json 自动添加 Xdebug 的相关配置,如果 lanuch.json 不存在则会自动新建,如果是调试 PHP 一般不用修改 lanuch.json 的默认内容,大多数情况下监听的端口都是 9003

5 调试

如果配置启用了自动调试,那么脚本的运行命令就不需要额外的参数, 浏览器也不需要 Xdebug Helper 插件。 但是这样会所有请求都启用调试。

命令行

  1. 在 VSCode 打开的文件夹里新建一个 PHP 脚本
  2. 在这个脚本里设置一个断点,然后点击开始调试
  3. 然后用这样的命令执行脚本
    • xdebug 2.9
      php -d xdebug.remote_autostart=on test.php
      
    • xdebug 3.0
      php -d xdebug.start_with_request=yes test.php
      
    • 在环境变量中,把 XDEBUG_SESSION 的值设为和配置中 idekey 的值一样也能触发调试
      export XDEBUG_SESSION=vscode; php test.php
      export XDEBUG_SESSION=vscodetest; php -d xdebug.idekey=vscodetest test.php
      set XDEBUG_SESSION=vscode && php test.php
      $Env:XDEBUG_SESSION = "vscode"; php test.php
      
  4. 如无意外,当代码运行到断点时会自动停止

web

  1. 在浏览器里安装 Xdebug Helper ,在浏览器的拓展搜索 Xdebug Helper 即可
  2. 在 Xdebug 的配置里添加这一项 xdebug.idekey
    xdebug.idekey = "vscode"
    
  3. 设置 Xdebug Helper 的 IDE Key 为 other ,vaule 为 vscode
  4. 这是点击,浏览器地址栏右边的 debug 图标就可以进行调试了
  5. 然后在浏览器里访问对应的地址
  6. Xdebug Helper 实现的原理是, xdebug.idekey 的值会添加到 cookies 里(大概像这样 XDEBUG_SESSION=vscode ), php 检测到 xdebug.idekey 后就会通知 IDE 启动调试
  7. 可以直接通过浏览器的控制台加上这个 cookie
    document.cookie="XDEBUG_SESSION=vscode"
    
  8. 用 postman 或 curl 这类工具测试时,只要 http 头的 cookie 带有 XDEBUG_SESSION=vscode ,就是触发调试的了,类似于这样
    curl -k --cookie "XDEBUG_SESSION=vscode" http://testurl
    

6. 使用分析工具

profiler 文件可以用 QCacheGrind 查看; trace 的文件是纯文本的,可以直接打开的。

QCacheGrind

  1. QCacheGrind 不支持 xdebug 3.0
  2. 下载 QCacheGrind
    https://sourceforge.net/projects/qcachegrindwin/
    
  3. Xdebug 的配置里需要有这两项, xdebug.profiler_output_dir 是分析文件的输出目录
    xdebug.profiler_enable = on
    xdebug.profiler_output_dir = ""
    
  4. 启动调试后,在这个目录里 xdebug.profiler_output_dir 找到分析文件,并使用 QCacheGrind 打开
  5. 分析文件的文件名通常是 cachegrind.out.7468 后面的数字是进程ID。

Webgrind

https://github.com/jokkedk/webgrind

其它

  • 需要把 PHP 的可执行文件加入到环境变量中,如果没有,则需要在 VSCode 里设置 php.validate.executablePath 的值
  • xdebug 2.9 升级 xdebug 3.0 的文档 https://xdebug.org/docs/upgrade_guide