PHP 7.4+ 无法使用原版 XHProf,因其依赖已移除的底层功能;应改用 tideways_xhprof 或 blackfire,前者兼容原接口与数据格式,后者需外部服务。

PHP 7.4+ 环境下无法直接装 XHProf?用 xhprof_disable() 会报错
原版 XHProf 是 Facebook 为 PHP 5.x 开发的,PHP 7.0 起彻底移除了 microtime() 的部分底层支持,导致编译失败。官方早已停止维护,xhprof_enable()、xhprof_disable() 这些函数在 PHP 7.4+ 中根本不存在——不是配置问题,是压根没加载成功。
替代方案只有两个:用社区维护的 tideways_xhprof(推荐),或改用 blackfire(需外部服务)。前者兼容原 XHProf 数据格式,能复用原有分析脚本和 UI;后者更现代但侵入性略强。
- 确认 PHP 版本:
php -v,若 ≥7.2,别再试原版 XHProf 源码编译 - 安装
tideways_xhprof扩展(Ubuntu/Debian):sudo apt install php-tideways-xhprof,然后检查php -m | grep tideways - 扩展启用后,
xhprof_enable()和xhprof_disable()就能用了,行为与原版一致
如何只分析某段关键逻辑,避免全站开销?
XHProf 类扩展默认会采集整个请求生命周期,但实际调试时往往只想看 getUserProfile() 或数据库查询那段。硬编码开关最可控,不依赖 URL 参数或配置项。
- 在入口或中间件里加条件判断:
if (isset($_GET['xhprof']) && $_GET['xhprof'] === '1') { xhprof_enable(); } - 在目标函数前后手动启停:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);—— 关掉内置函数能大幅减少数据量 - 切勿在循环里反复调用
xhprof_enable()/xhprof_disable(),会导致嵌套错误和内存泄漏
生成的 profile 数据怎么读?重点关注哪几列?
xhprof_disable() 返回的是嵌套数组,结构类似:['main()==>foo' => ['ct' => 12, 'wt' => 12456, 'cpu' => 8921, 'mu' => 102400]。其中 ct(call count)和 wt(wall time,毫秒)最实用;cpu 和 mu(memory usage)仅当开启对应 flag 才有值。
立即学习“PHP免费学习笔记(深入)”;
-
wt高但ct低 → 单次调用慢,比如某个file_get_contents()卡住 -
ct高但wt总和不高 → 频繁小调用,比如循环里反复 new 对象,可考虑对象池 - 注意看父级调用链,例如
Controller::index==>Model::find耗时占比异常,说明问题不在 Controller 层
Web UI 不显示图表或报 “Invalid data format”?
常见原因是数据序列化方式不匹配。XHProf 原生用 serialize(),而 tideways_xhprof 默认用 json_encode()。如果你沿用旧的 xhprof_lib UI,必须强制用 serialize:
- 采集后保存前转成原格式:
$xhprof_data = xhprof_disable(); file_put_contents("/tmp/xhprof_".time().".xhprof", serialize($xhprof_data)); - UI 的
include路径要指向你本地的xhprof_lib,不是 Composer 自动加载的路径 - PHP CLI 和 Web Server(如 Apache 的 mod_php 或 FPM)的扩展启用状态可能不同,
phpinfo()页面里搜tideways确认 Web 环境已加载
真正麻烦的从来不是装上,而是数据对不上——同一段代码,在 CLI 下 profile 正常,Web 下为空,八成是扩展没在 FPM 配置里启用,或者 opcache 缓存了旧的函数定义。



















