PHP 7.4+ 中原版 XHProf 不可用,因其依赖的底层 API 已被移除;应改用 tideways_xhprof,安装后 xhprof_enable() 等函数即可正常使用,且兼容原接口与数据格式。

PHP 7.4+ 环境下 xhprof_enable() 报错或根本不存在?
不是配置漏了,也不是 extension 没加载——是原版 XHProf 在 PHP 7.4+ 中压根没编译进去。Facebook 原版依赖已移除的底层 API(比如部分 microtime() 实现),PHP 官方从 7.0 起就切断了支持,所以 xhprof_enable()、xhprof_disable() 这些函数在 7.2+ 就会直接报 Fatal error: Uncaught Error: Call to undefined function xhprof_enable()。
别再试源码编译或 PECL install xhprof;当前唯一可行路径是:
• Ubuntu/Debian:运行 sudo apt install php-tideways-xhprof(注意不是 php-xhprof)
• 检查是否生效:php -m | grep tideways,有输出即成功
• 启用后,xhprof_enable() 和 xhprof_disable() 就能照常调用,行为与原版一致
只分析某段关键逻辑,而不是整个请求?
全量采集开销大、数据噪音多,尤其在 Web 请求中,你通常只关心 getUserProfile() 或某个 DB 查询环节。硬编码启停最可靠,不依赖 URL 参数或全局开关。
- 在目标函数前加
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY):关掉echo、strlen等内置函数记录,大幅减少数据体积 - 在函数结束后立刻调用
$data = xhprof_disable(),不要延迟或跨作用域 - 绝对避免在循环里反复调用
xhprof_enable()/xhprof_disable():会导致嵌套计数错乱、内存泄漏,甚至 segfault
xhprof_disable() 返回的数据结构怎么看?
返回的是一个嵌套关联数组,键为 "parent==>child" 形式(如 "main()==>mysqli_query"),值为指标数组。重点关注以下字段:
立即学习“PHP免费学习笔记(深入)”;
-
ct(call count):该调用链被触发次数。若ct高但总wt低 → 频繁小调用(比如循环里 new 对象) -
wt(wall time,毫秒):真实耗时。若wt高但ct= 1 → 单次阻塞严重(比如外部 HTTP 请求超时) -
cpu和mu仅在启用对应 flag 后存在;mu持续增长可能暗示对象未释放 - 别只看叶子节点:例如
Controller::index==>Model::find占比异常高,说明瓶颈在 Model 层,而非 Controller
Web UI 显示 “Invalid data format” 或图表空白?
大概率是序列化方式不匹配。原版 XHProf 默认用 serialize() 存储数据,而 tideways_xhprof 扩展默认用 json_encode()。如果你沿用旧版 xhprof_lib(比如 xhgui 或自建 UI),必须显式强制使用 serialize:
在保存前加一行:xhprof_runs_default::$use_serialize = true;,否则 include_once 'xhprof_lib/utils/xhprof_runs.php' 读取时会解包失败。
另一个常见坑:xhprof.output_dir 设在 web 可访问路径(如 /var/www/html/xhprof/output)→ 不仅安全风险高,某些 UI 还会因路径解析错误拒载数据。务必设为 /tmp/xhprof 或 /var/xhprof,并确保 PHP 进程有写权限。



















