根本原因是xdebug默认三重限制:max_depth=3、max_children=128、max_data=512,需在php.ini中配置并重启服务,设为-1可不限制(慎用),开发常用值为6~10、256、2048。

var_dump 或 ThinkPHP 的 dump 输出被截断、显示省略号(…)、深层结构变成 (recursive) 或直接不展开,根本原因不是代码问题,而是 Xdebug 默认的三重限制在起作用。调参不是可选项,而是调试时的必备动作。
为什么变量总显示不全
Xdebug 对 var_dump 的美化输出做了硬性约束,三项默认值极低:
- xdebug.var_display_max_depth 默认为 3 —— 到第三层嵌套就停止展开,对象或数组再深就缩成 (recursive) 或省略
- xdebug.var_display_max_children 默认为 128 —— 数组键或对象属性超过 128 个,后续全部丢弃
- xdebug.var_display_max_data 默认为 512 —— 字符串、JSON、序列化内容超 512 字节就被截断,末尾显示 …
怎么改才真正生效
这三个参数只能在 php.ini(或独立的 xdebug.ini)中配置,运行时用 ini_set() 完全无效,因为它们属于 PHP_INI_SYSTEM 级别。修改后必须重启 PHP 服务(如 php-fpm、Apache 或 Nginx)。
- 设为 -1 表示不限制(慎用:大数组可能卡死浏览器或拖慢调试器)
- 开发常用平衡值:max_depth=6~10(对象嵌套常见 5~8 层),max_children=256,max_data=2048
- Xdebug 3+ 用户注意:xdebug.mode 必须包含 develop(如
xdebug.mode=develop,debug),否则这些设置不加载
ThinkPHP 和 VSCode 调试也适用
ThinkPHP 的 dump() 底层仍走 var_dump,同样受 Xdebug 限制;VSCode 的 PHP Debug 插件读取变量时,也是通过 Xdebug 协议获取,所以 launch.json 中也可覆盖:
"xdebugSettings": {
"max_depth": 8,
"max_children": 512,
"max_data": 4096
}
该配置优先级高于 php.ini,适合项目级临时调整。
别漏掉 show_local_vars
调试时想看函数内所有局部变量(包括未显式 echo 的中间变量),需额外开启:
- 在 php.ini 中加一行:xdebug.show_local_vars = 1
- 重启服务后,在 IDE 断点处就能看到完整作用域变量列表,不止是当前表达式结果











