xdebug断点调试成功的关键是三者严格匹配:xdebug.mode=debug生效、xdebug.client_port与phpstorm监听端口(默认9003)完全一致、ide key双向设为phpstorm(大小写敏感),缺一则f7/f8无法单步。

能设断点不等于能单步调试,更不等于能看清堆栈——关键在 xdebug.mode=debug 生效、xdebug.client_port 与 PhpStorm 监听端口完全一致、IDE key 双向匹配为 PHPSTORM。三者缺一,F7/F8 就只是跳过,不是单步。
确认 Xdebug 已加载且 mode 含 debug
别只看 phpinfo() 页面有没有 “Xdebug” 标题栏。右键浏览器页面 → 查看网页源代码 → 全选复制整页内容 → 粘贴到 xdebug.org/wizard,它会告诉你该下哪个 exact 版本的 php_xdebug-*.dll 或 xdebug.so。
验证是否真生效:
-
php -v输出里必须带小写xdebug字样(大写开头的“Xdebug”可能是假扩展) -
php --ri xdebug输出中重点检查:
—xdebug.mode值是否包含debug(如debug,develop可以,off或空值不行)
—xdebug.client_port是否为9003(Xdebug 3.x 默认值,不是 9000)
—xdebug.start_with_request是yes还是trigger,决定你是否必须加 URL 参数
PhpStorm 端监听配置必须手动对齐
PhpStorm 不会读取 php.ini,它只认自己设置的端口和开关。进 Settings → PHP → Debug,检查以下三项:
-
Debug port必须和xdebug.client_port完全一致(默认都是9003,但有人手抖改成9000或9002) -
Can accept external connections必须勾选,否则连接直接被丢弃 -
IDE key必须设为PHPSTORM(大小写敏感,不能是phpstorm或PhpStorm)
若项目跑在 Docker、WSL 或远程服务器上,还必须进 Settings → PHP → Servers 添加对应 host,并启用 Use path mappings,把容器内路径(如 /var/www/html)映射到本地项目路径(如 D:\project),否则断点命中但不暂停。
触发调试前先验证 IDE Key 传递是否成功
断点不响,90% 是请求压根没带调试指令。Xdebug 不会自动监听所有请求,必须显式激活:
- 用
Xdebug Helper浏览器插件(Chrome/Firefox),点击图标 → 选Debug,它会在 URL 后自动加?XDEBUG_SESSION_START=PHPSTORM - 确保插件设置里的
IDE Key是PHPSTORM,且和 PhpStorm 中Settings → PHP → Debug → Xdebug → IDE key一致 - 命令行调试不要依赖
php -dxdebug.start_with_request=yes script.php,部分 PHP 版本不支持;改用XDEBUG_SESSION=PHPSTORM php script.php
堆栈追踪失效?检查 xdebug.mode 和 error_reporting
Xdebug 的美化堆栈(含完整调用链、变量 dump、超全局数组展开)不是默认全开的。它依赖两个前提:
-
xdebug.mode必须包含develop(如debug,develop)。仅debug不够,develop才接管var_dump()、错误提示和堆栈格式 -
error_reporting不能是0或屏蔽了E_WARNING/E_NOTICE;Xdebug 的增强堆栈只在 PHP 原生报错触发时才叠加渲染 - 若用
try/catch捕获了异常但没throw或error_log,堆栈也不会出来——Xdebug 不会主动“挖出”静默异常
堆栈最易被忽略的一点:xdebug.mode=develop 单独启用时,不会启动调试会话,但会让所有 var_dump() 变成可折叠结构、让 Warning 显示完整调用路径。这点常被当成“调试没起作用”,其实是功能分开了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











