必须用QCacheGrind等可视化工具解析cachegrind.out文件才能看到调用关系;文本编辑器打开仅显示原始fl=/fn=/calls=字段,无法识别函数调用树和耗时分布,因Xdebug输出的是机器可读的profile原始数据而非人类可读报表。

直接看 cachegrind.out.* 文件本身没用,必须用支持 cachegrind 格式的可视化工具打开,否则全是不可读的文本堆栈。
为什么打开后看不到函数调用关系?
常见现象是:用文本编辑器打开 cachegrind.out.12345,看到一堆 fl=、fn=、calls= 行,但完全看不出谁调用了谁、哪段耗时最多。
- 这是正常行为——Xdebug 输出的是原始 profile 数据,不是人类可读报告
- 必须通过
qcachegrind、webgrind或 PhpStorm 内置分析器加载,才能解析出调用树和时间分布 - 如果用
cat或 VS Code 直接打开,你只在看“机器语言”,不是“报表”
qcachegrind 中关键字段含义
启动 qcachegrind /var/tmp/xdebug/cachegrind.out.98765 后,重点关注三列:
-
Incl.(inclusive time):该函数从进入直到所有子调用返回的总耗时(含它调用的所有函数) -
Self(self time):该函数自身代码执行时间(不含子调用),高 Self 值说明函数内部有计算瓶颈(如循环、正则、序列化) -
Calls:被调用次数,配合Self可判断是否因高频小操作拖慢整体(例如array_key_exists()被调用 5000 次)
注意:Self 高 ≠ 一定有问题;要结合调用上下文看——比如 mysqli_query() 的 Self 高,大概率是 SQL 本身慢,不是 PHP 层问题。
Xdebug 3.4.1 是一款功能强大的 PHP 调试扩展工具,于 2025 年 1 月 6 日正式发布。作为 Xdebug 3.4 系列的首个修复版本,3.4.1 版在继承上一版本强大功能的同时,重点解决了稳定性问题。该版本不仅修复了访问超全局变量时可能引发的程序崩溃现象,还增强了对 Windows 平台 PIE 构建机制的支持,为广大 PHP 开发者提供了更加稳定的调试环境。这一版本适合所有
Webgrind 里容易误读的两个配置项
如果你部署了 webgrind,它的 config.php 里这两个设置直接影响你看到什么:
-
defaultCostFormat = 'microseconds':设为'percent'更利于快速定位占比大的函数(避免被绝对数值干扰) -
defaultFunctionPercentage = 1:表示只显示累计耗时 ≥ 1% 的函数。设太高会漏掉关键中间层(比如某个foreach循环占 0.8%,但它在核心逻辑里被反复调用)
建议调试期设为 0.1,确认瓶颈后再逐步收紧阈值。
Call Graph 功能为啥点不开?
在 qcachegrind 或 webgrind 里点击 “Call Graph” 报错或空白,大概率是以下原因:
- Xdebug 版本太新(≥ 3.1)且未启用完整调用记录:
xdebug.mode=profile,debug不够,得加xdebug.collect_functions=1 - 生成文件时没带触发参数:仅靠
xdebug.profiler_enable=1全局开启,会导致 Call Graph 数据不全;推荐始终用xdebug.profiler_enable_trigger=1+ URL 参数方式触发 - graphviz 未安装或不在 PATH:即使装了
brew install graphviz,也要确认dot -V能执行成功
Call Graph 是唯一能直观看出“谁调用了谁、调了多少次、每条路径耗时多少”的视图,别跳过验证这一步——它常暴露隐藏的递归调用或意外的框架钩子开销。


















