本文目录导读:

- Xdebug(最常见,适合开发环境)
- XHProf / Tideways(轻量级,适合生产环境)
- Blackfire.io(专业商业方案,有免费额度)
- 内置简易 Profiling:
xhprof_sample/tideways采样 - 命令行性能分析
- 最快速的 “零安装” 方案:Strauss / FirePHP
- 总结推荐
在 PHP 中进行性能剖析(Performance Profiling),主要有 Xdebug、XHProf、Tideways 以及 Blackfire.io 这几种主流工具。
以下从安装配置到实际使用,分场景介绍这几种方法:
Xdebug(最常见,适合开发环境)
Xdebug 最常用的功能是生成函数调用堆栈和代码覆盖率,但它的性能分析(Profiling)功能非常强大,会生成一个 Cachegrind 格式的文件,可以用图形化工具(如 QCacheGrind、WebGrind)查看。
安装与配置:
# 安装(假设用 pecl) pecl install xdebug # 或者使用 PHP 8+ 的版本 pecl install xdebug-3.3.1
php.ini 配置(开启 profiling):
[xdebug] zend_extension=xdebug.so ; 开启性能分析 xdebug.mode=profile ; 分析结果输出目录(确保存在且有写权限) xdebug.output_dir=/tmp/profiling ; 可选:只分析特定路径的请求,避免全量分析影响性能 ; xdebug.profiling_aggregate=1 ; xdebug.profiling_output_name = cachegrind.out.%p
使用:
- 重启 PHP-FPM 或 Web Server。
- 正常访问你的 PHP 页面。
- 每次请求会在
/tmp/profiling/下生成一个类似cachegrind.out.12345的文件。 - 查看结果:
- Linux/Mac(图形界面): 安装 QCacheGrind:
sudo apt install qcachegrind→ 打开文件。 - Windows: 使用 WinCacheGrind 或 QCacheGrind。
- 在线/免安装: 使用 WebGrind(一个 PHP 写的 Web 界面):
git clone https://github.com/jokkedk/webgrind.git,放置到你的 Web 目录,访问即可。
- Linux/Mac(图形界面): 安装 QCacheGrind:
优缺点:
- ✅ 非常详细,可以看到每个函数的调用次数、自身耗时、内存占用。
- ❌ 性能开销大,生产环境强烈不建议开启。
XHProf / Tideways(轻量级,适合生产环境)
XHProf 是 Facebook 开源的,本身已停止维护,但有社区维护的 tideways_xhprof 或 xhprof 扩展,Tideways 是商业产品,但提供了免费的开源扩展。
特点: 开销极低(< 15%),可以在生产环境开启采样分析。
安装:
# 安装 tideways_xhprof(推荐,兼容 PHP 7/8) pecl install tideways_xhprof
php.ini 配置:
extension=tideways_xhprof.so ; 可选:默认采样率 ; tideways.auto_profile=1 ; tideways.auto_prepend_library=0
代码嵌入(手动触发分析):
<?php
// 在脚本最开头(如 index.php 入口)启动分析
tideways_xhprof_enable(TIDEWAYS_XHPROF_FLAGS_MEMORY | TIDEWAYS_XHPROF_FLAGS_CPU);
// ... 你的正常业务逻辑 ...
// 在脚本结束处(如框架的 shutdown 事件)停止并保存
$xhprof_data = tideways_xhprof_disable();
// 保存分析结果(可以存文件或数据库)
file_put_contents('/tmp/xhprof/' . uniqid() . '.xhprof', serialize($xhprof_data));
// 查看结果通常需要用 XHProf UI 界面(从老 XHProf 项目复制)
// 需要部署一个小的 PHP 项目来读取这些数据并展示火焰图/表格
查看结果(部署 XHProf UI):
- 从官网或 Github(
xhprof/xhprof_lib)复制xhprof_html和xhprof_lib到一个 Web 目录。 - 配置 UI 读取你保存的
.xhprof文件路径。 - 通过浏览器访问
http://your-server/xhprof_html/查看。
优缺点:
- ✅ 性能开销小,包含层次化调用统计及火焰图。
- ❌ 需要手动插入代码或配置自动预加载,UI 比较古老。
Blackfire.io(专业商业方案,有免费额度)
Blackfire 是 SensioLabs(Symfony 之父)开发的性能管理平台,支持持续集成、自动建议。
特点: 自动化程度高,直接对比不同版本性能,提供性能优化建议。
快速开始:
- 官网注册,获取
SERVER_ID和SERVER_TOKEN。 - 安装 Agent 和 Probe(PHP 扩展)。
- 安装客户端 CLI:
curl -O https://blackfire.io/api/v1/releases/cli/linux/amd64 && ... - 在页面 URL 上加参数
?blackfire或在 CLI 中php -d blackfire.agent_timeout=5 script.php。
优点: 可视化极好,支持函数级调用链、I/O、SQL 分析,甚至能检测出 N+1 查询。 缺点: 免费版有一定限制(如每天剖析次数),高级功能需要付费。
内置简易 Profiling:xhprof_sample / tideways 采样
如果你只想知道哪个函数最耗 CPU,不想看全量,可以用采样模式:
<?php
if (mt_rand(1, 100) == 1) { // 1% 采样
tideways_xhprof_enable();
register_shutdown_function(function() {
$data = tideways_xhprof_disable();
// 保存...
});
}
命令行性能分析
如果你的代码是 CLI 脚本(队列、定时任务):
# 使用 Xdebug php -dxdebug.mode=profile -dxdebug.output_dir=/tmp/profiling myscript.php # 使用 Blackfire blackfire run php myscript.php
最快速的 “零安装” 方案:Strauss / FirePHP
如果你只是临时想看某个请求的粗略性能,可以用 microtime(true) 手工标记:
$start = microtime(true); // ... 一段代码 ... echo "耗时: " . (microtime(true) - $start) . " sec\n";
但这种方式很原始,适合定位特定段,不适合全貌。
总结推荐
| 场景 | 推荐工具 | 理由 |
|---|---|---|
| 开发环境 找瓶颈 | Xdebug + QCacheGrind | 最详细,免费,图形化 |
| 生产环境 低开销采样 | Tideways / XHProf | 开销小,可部署到生产 |
| 全栈性能管理(含数据库、HTTP) | Blackfire.io | 自动优化建议,专业 |
| 快速排查(无需装扩展) | **手工 microtime |
零成本,适合简单场景 |
| 容器 / Kubernetes 环境 | Tideways + 自动注入 | 支持 sidecar 模式 |
操作建议: 先在生产环境用 Tideways(1% 采样) 快速定位大方向,然后到开发环境用 Xdebug 精细分析具体的函数调用链和内存泄漏。