Yii2.0.51集成XHProf核心是精准采样、正确保存与可视化定位:需确保xhprof扩展启用、output_dir可写;在web/index.php顶部xhprof_enable()、底部xhprof_disable()并用\XHProfRunsDefault保存;强制关闭YII_DEBUG和日志写入以避免干扰;通过xhprof_html查看Inclusive/Exclusive耗时及调用图定位瓶颈。

直接在 Yii2.0.51 中集成 XHProf,核心是“精准采样 + 正确保存 + 可视化定位”。它不依赖 Yii 框架本身,但必须绕开框架默认行为(比如调试模式干扰、入口逻辑跳转),才能拿到真实、可比的函数级耗时数据。
确保XHProf扩展已正确安装并启用
这是前提,缺一不可:
- 运行 php -m | grep xhprof,输出含
xhprof才算加载成功 - 检查 php.ini 是否包含
extension=xhprof.so(Linux)或extension=xhprof.dll(Windows) - 确认
xhprof.output_dir已设置且 Web 进程有写权限,例如:xhprof.output_dir="/tmp/xhprof" - 重启 PHP-FPM 或 Apache/Nginx,避免配置缓存
在Yii2入口处嵌入XHProf采集逻辑
不要改 Yii 的 debug 模块,而是直接干预请求生命周期。推荐在 web/index.php 顶部启用、底部关闭:
- 顶部加入:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); - 底部(
require __DIR__ . '/../vendor/autoload.php';之后、(new yii\web\Application($config))->run();之前)加入:
include_once __DIR__ . '/../vendor/xhprof/xhprof_lib/utils/xhprof_runs.php';
$xhprof_data = xhprof_disable();
$objXhprofRun = new \XHProfRunsDefault();
$objXhprofRun->save_run($xhprof_data, 'yii2-' . date('Ymd-His') . '-' . uniqid());
注意:\XHProfRunsDefault 前的反斜杠不能省,否则命名空间解析失败。
避开Yii调试模式与中间件干扰
Yii2.0.51 的 YII_DEBUG=true 会显著放大开销,导致 XHProf 数据失真:
- 务必在
web/index.php第一行强制定义:defined('YII_DEBUG') or define('YII_DEBUG', false); - 检查所有 config 文件(特别是
main-local.php),确保没有二次覆盖YII_DEBUG - 禁用日志文件写入:
'targets' => []或移除FileTarget,防止 I/O 混淆 CPU 时间 - 若使用自定义中间件(如性能监控类),临时注释掉,避免叠加采样
查看报告并聚焦关键指标
将 xhprof_html/ 目录放到 Web 可访问路径(如 Nginx root 下的 /xhprof),访问 http://yoursite/xhprof/xhprof_html/index.php:
- 优先看 Inclusive Wall Time %:总耗时占比高的函数,说明它是瓶颈源头(比如
ActiveRecord::find()占 45%,就要查它背后 SQL 或关联预加载) - 对比 Exclusive Wall Time:值高说明函数自身逻辑重(如正则匹配、数组遍历),不是调用子函数拖慢的
- 点开 View Full Callgraph(需提前装 graphviz):直观看到哪一层
foreach → helper::format() → str_replace形成热点链 - 内存列(
Memory (bytes))关注 pmu(峰值内存):某函数 pmu 突增,可能暗示大数组未释放或循环引用



















