PHP XHProf 性能分析工具安装和基本使用生成性能图(Graphviz)实践

PHP XHProf 性能分析工具安装和基本使用生成性能图(Graphviz)实践

一、XHProf简介

XHProf是一个轻量级的PHP性能分析工具,可以分析函数级别的请求次数和各种指标,包括CPU、内存、负载等。 与Xdebug相比,XHProf更加易用和可控,尤其是生成流程图和调试数据对比的功能很好很强大。

XHProf 这也是官方力荐的性能分析工具。

https://www.php.net/manual/zh/book.xhprof.php

二、环境准备

1. 安装XHProf

方法一:通过PECL安装(推荐)

1
2
3
4
5
6
7
# 安装PHP开发工具
sudo apt-get install php-dev php-pear # Ubuntu/Debian
# 或
sudo yum install php-devel php-pear # CentOS/RHEL

# 通过PECL安装xhprof
sudo pecl install xhprof

方法二:源码编译安装

1
2
3
4
5
6
7
8
9
10
11
# 下载源码
wget https://pecl.php.net/package/xhprof
tar -zxvf xhprof-*.tgz
cd xhprof-*/

# 生成configure文件
/usr/bin/phpize

# 编译安装
./configure --with-php-config=/usr/bin/php-config
make && make install

2. 配置PHP

编辑php.ini文件,添加以下配置:

1
2
3
[xhprof]
extension=xhprof.so
xhprof.output_dir="/tmp/xhprof"

创建输出目录:

1
2
sudo mkdir -p /tmp/xhprof
sudo chmod 777 /tmp/xhprof

重启PHP服务:

1
2
3
4
5
6
7
8
# PHP-FPM
sudo systemctl restart php-fpm

# 或Apache
sudo systemctl restart apache2

# 或Nginx + PHP-FPM
sudo systemctl restart nginx php-fpm

三、安装Graphviz(生成性能图必备)

Graphviz是一个图形可视化软件包,可以让XHProf以图片的形式很直观地展示代码执行耗时。

CentOS/RHEL系统

1
sudo yum install graphviz

Ubuntu/Debian系统

1
sudo apt-get install graphviz

源码编译安装(可选)

1
2
3
4
5
6
wget https://graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar -zxvf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install

安装完成后,会生成/usr/local/bin/dot文件,需要确保该路径在PATH环境变量里,以便XHProf能找到它。

四、XHProf使用示例

1. 基本使用

在需要分析的PHP文件开头添加:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
// 启动性能分析
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);

// 你的业务代码
function test_function() {
for ($i = 0; $i < 1000; $i++) {
$a = $i * 2;
}
}
test_function();

// 停止分析并获取数据
$xhprof_data = xhprof_disable();

// 保存数据
$namespace = 'myapp';
$run_id = mt_rand(10000, 99999);
file_put_contents("/tmp/xhprof/{$run_id}.{$namespace}.xhprof", serialize($xhprof_data));

2. 创建分析报告页面

创建xhprof_html/index.php文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php
// 路径设置
define('XHPROF_LIB_ROOT', dirname(__FILE__) . '/../xhprof_lib');

// 加载必要的文件
require_once XHPROF_LIB_ROOT . '/utils/xhprof_lib.php';
require_once XHPROF_LIB_ROOT . '/utils/xhprof_runs.php';

// 设置运行环境
$_xhprof = array('display' => true, 'dsource' => 'xhprof');

// 创建运行实例
$xhprof_runs = new XHProfRuns_Default();

// 获取参数
$run_id = $_GET['run'] ?? null;
$source = $_GET['source'] ?? 'xhprof';

if ($run_id) {
// 生成报告
$xhprof_runs->displayXHProfReport($run_id, $source);
} else {
// 列出所有分析文件
$files = glob("/tmp/xhprof/*.xhprof");
echo "<h1>XHProf Reports</h1>";
echo "<ul>";
foreach ($files as $file) {
$filename = basename($file);
preg_match('/(\d+)\.(\w+)\.xhprof$/', $filename, $matches);
if ($matches) {
$run_id = $matches[1];
$source = $matches[2];
echo "<li><a href='?run=$run_id&source=$source'>$filename</a></li>";
}
}
echo "</ul>";
}
?>

五、生成性能图

1. 配置Graphviz路径

确保XHProf能正确找到Graphviz的dot命令。通常需要在xhprof_lib/utils/config.php中设置:

1
2
// 设置dot命令路径
$_xhprof['dot_binary'] = '/usr/bin/dot'; // 根据实际安装路径调整

2. 生成调用图

访问分析报告页面后,点击”View Full Callgraph”链接,XHProf会自动调用Graphviz生成调用图。

XHProf是可以使用graphviz生成图片的,这样分析的php程序运行过程更加直观。

六、高级配置

1. 忽略内置函数

1
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY, array('ignored_functions' => array('call_user_func', 'call_user_func_array')));

2. 设置采样率(生产环境推荐,因存在性能开销,更推荐测试环境部署或预发布环境使用)

1
2
3
4
5
6
7
8
9
// 1%的请求进行性能分析
if (mt_rand(1, 100) === 1) {
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
register_shutdown_function(function() {
$data = xhprof_disable();
$run_id = mt_rand(10000, 99999);
file_put_contents("/tmp/xhprof/{$run_id}.production.xhprof", serialize($data));
});
}

七、常见问题解决

1. 权限问题

确保/tmp/xhprof目录对PHP进程有写权限:

1
2
3
sudo chown -R www-data:www-data /tmp/xhprof  # Ubuntu/Debian
# 或
sudo chown -R nginx:nginx /tmp/xhprof # CentOS/RHEL

2. Graphviz路径问题

如果无法生成图片,检查dot命令路径:

1
2
which dot
# 通常为 /usr/bin/dot 或 /usr/local/bin/dot

3. PHP版本兼容性

XHProf对不同PHP版本的兼容性:

  • PHP 5.x: 使用官方XHProf
  • PHP 7.x: 使用Tideways或XHProf fork版本
  • PHP 8.x: 推荐使用Tideways

八、验证安装

创建一个测试文件test_xhprof.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
if (extension_loaded('xhprof')) {
echo "XHProf extension loaded successfully!";

// 测试Graphviz
if (file_exists('/usr/bin/dot') || file_exists('/usr/local/bin/dot')) {
echo "<br>Graphviz is installed and ready to generate call graphs.";
} else {
echo "<br>Warning: Graphviz not found. Call graphs cannot be generated.";
}
} else {
echo "XHProf extension not loaded. Please check your PHP configuration.";
}
?>

最后访问该文件,如果看到成功消息,说明安装配置正确。

通过以上步骤,您已经成功安装了XHProf性能分析工具,并配置了Graphviz来生成直观的性能分析图表,可以开始对PHP应用进行性能优化了。

借助 XHProf 可以实现更精细的性能诊断和优化。

查看XHProf历史报告或者指定某个ID报告的方式

1. 基本访问方式

  • 查看XHProf的历史报告,首先需要将XHProf的Web界面文件部署到Web服务器上。
  • XHProf自带一个web查看工具,位于扩展源码的压缩包里,是一些php代码。

部署Web界面

  1. 将XHProf源码包中的 xhprof_htmlxhprof_lib 目录复制到Web服务器的根目录下
  2. 确保Web服务器对该目录有读取权限

访问报告列表 ( 域名以wdft.com为例 )

访问以下URL即可查看所有历史分析报告:

1
https://wdft.com/xhprof_html/

1
https://wdft.com.com/xhprof/xhprof_html/index.php

通过浏览器访问该URL,即可看到xhprof分析结果文件列表,点击任意一个报告可以查看详情。

2. 查看具体报告

查看单个报告

在报告列表页面,点击任意一个报告文件(格式通常为 xxxxxxx.test.xhprof),其中xxxxxxx就是报告ID($run_id)。

访问格式:

https://wdft.com.com/xhprof_html/index.php?run=```[报告ID]```&source=```[命名空间]```

1
2
# 例:https://wdft.com.com/xhprof_html/index.php?run=[ID]&source=test
https://wdft.com.com/xhprof_html/index.php?run=5d3f9a1b2c3d&source=test

查看调用关系图

在报告详情页面,点击 [View Full Callgraph] 按钮,即可查看以图片形式展示的函数调用关系图。

如果无法生成调用图,需要先安装graphviz:

1
2
3
yum install graphviz  # CentOS/RHEL
# 或
apt-get install graphviz # Ubuntu/Debian

3. 直接访问指定报告

如果你知道具体的报告ID和命名空间,可以直接通过URL访问指定报告:

1
https://your-domain.com/xhprof_html/index.php?run=12345&source=yourapp

其中:

  • run 参数是报告的唯一ID
  • source 参数是命名空间(通常是你在保存报告时指定的)

4. 高级功能

差异对比报告

XHProf支持对多个结果进行差异对比或者汇总,这对性能优化非常有帮助。

访问格式:

1
https://your-domain.com/xhprof_html/index.php?run1=报告ID1&run2=报告ID2&source=命名空间

通过代码生成报告URL

你可以在PHP代码中生成报告查看链接:

1
2
3
4
$run_id = '12345'; // 你的报告ID
$namespace = 'test'; // 你的命名空间
$report_url = "/xhprof_html/index.php?run={$run_id}&source={$namespace}";
echo "查看报告: <a href='{$report_url}'>点击这里</a>";

5. 常见问题解决

404错误

  • 检查 xhprof_html 目录是否正确放置在Web根目录下
  • 确认Web服务器配置是否正确

权限问题

  • 确保Web服务器用户对 xhprof.output_dir 配置的目录有读写权限
  • 检查 xhprof_lib 目录的权限设置

无法生成调用图

  • 确认Graphviz已正确安装
  • 检查XHProf配置中是否指定了正确的dot命令路径

通过浏览器中访问xhprof_html目录下的index.php路径,就可以看到所有访问页面的分析数据,点击其中一条数据的链接,会看到整个访问的详细分析数据。

小结

借助 XHProf + Graphviz 工具可以直观了解代码运行的逻辑和性能,也是团队CodeReview的利器。

PHP XHProf 性能分析工具安装和基本使用生成性能图(Graphviz)实践

https://www.wdft.com/e3ad55d6.html

Author

Jaco Liu

Posted on

2023-10-07

Updated on

2026-01-07

Licensed under