安装xhprof扩展
1 2 3 4 5 6 7 8 | wget http:
tar zxf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension/
sudo phpize
./configure
sudo make
sudo make install
cd ../
|
Salin selepas log masuk
配置php.ini
1 2 3 | [xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp
|
Salin selepas log masuk
注:xhprof已经很久没有更新过了,截至目前还不支持php7,php7可以使用 https://github.com/phacility/...。
配置xhprof环境
需要把xhprof压缩包里的两个目录复制到指定目录(假设定义到 /work/xhprof/
):
1 2 3 | mkdir /work/xhprof/
cp -a xhprof_html/ /work/xhprof/
cp -a xhprof_lib/ /work/xhprof/
|
Salin selepas log masuk
然后在项目框架的入口文件添加:
1 2 3 4 5 6 7 8 9 10 11 | xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
register_shutdown_function( function () {
$xhprof_data = xhprof_disable();
if (function_exists('fastcgi_finish_request')){
fastcgi_finish_request();
}
include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php" ;
include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php" ;
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs ->save_run( $xhprof_data , 'xhprof');
});
|
Salin selepas log masuk
Salin selepas log masuk
代码解析:
$xhprof_data
中记录了程序运行过程中所有的函数调用时间及CPU内存消耗,具体记录哪些指标可以通过xhprof_enable的参数控制,目前支持的参数有:
HPROF_FLAGS_NO_BUILTINS
跳过所有内置(内部)函数。
XHPROF_FLAGS_CPU
输出的性能数据中添加 CPU 数据。
XHPROF_FLAGS_MEMORY
输出的性能数据中添加内存数据。
之后的处理已经与xhprof扩展无关,大致是编写一个存储类XHProfRuns_Default
,将$xhprof_data
序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)
将结果输出到当前目录,如果不指定则会读取php.ini
配置文件中的xhprof.output_dir
,仍然没有指定则会输出到/tmp
。
xhprof_enable
和xhprof_disable
是成对出现的,一个是代码运行最前面,一个是最后面。中间是要分析的代码。
经过上面的配置后,我们后续请求项目的接口,xhprof就会分析请求过程中的CPU、内存、耗时等内容。日志保存在xhprof.output_dir
目录。
配置web
配置好了,怎么查看日志呢?我们可以搭建一个简单的web server:
xhprof.test.com.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | server {
listen 80;
server_name xhprof.test.com;
root /work/xhprof/xhprof_html;
index index.html index.php;
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ;
include fastcgi_params;
}
}
|
Salin selepas log masuk
然后配置虚拟主机xhprof.test.com。重启nginx,打开 xhprof.test.com就可以看到效果了:

![1530948733464990.png 1599082213-5b27c405e6c95_articlex[1].png](/static/imghw/default1.png)
默认的UI里列出了:
在web中还可以看到 [View Full Callgraph] 链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz。graphviz是一个绘制图形的工具,可以更为直观的让你查看性能的瓶颈。如果需要可以安装:
1 2 | yum install -y libpng
yum install -y graphviz
|
Salin selepas log masuk
效果:
![1530948741239972.png 2522854532-5b27c405e2d35_articlex[1].png](/static/imghw/default1.png)
非侵入式引入xhprof
前面我们是通过在项目入口文件添加代码实现了分析的功能。更优雅的方式是新建一个额外的文件 xhprof.inc.php,保存在/work/xhprof/
目录下:
1 2 3 4 5 6 7 8 9 10 11 | xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
register_shutdown_function( function () {
$xhprof_data = xhprof_disable();
if (function_exists('fastcgi_finish_request')){
fastcgi_finish_request();
}
include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php" ;
include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php" ;
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs ->save_run( $xhprof_data , 'xhprof');
});
|
Salin selepas log masuk
Salin selepas log masuk
利用PHP的自动加载功能,在执行代码前注入此文件,编辑php.ini:
1 | auto_prepend_file = /work/xhprof/xhprof.inc.php
|
Salin selepas log masuk
然后重启PHP服务。这样所有使用该php环境的都会生效。
或者写到指定项目的nginx配置里也行:
jifen.cc.conf
1 2 3 4 5 6 7 8 | location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root $fastcgi_script_name ;
fastcgi_param PHP_VALUE "auto_prepend_file=/work/xhprof/xhprof.inc.php" ;
include fastcgi_params;
}
|
Salin selepas log masuk
然后重启nginx服务。这样仅该项目生效。
通过 auto_prepend_file 和 auto_append_file包含的文件在此模式下会被解析,但有些限制,例如函数必须在被调用之前定义。
修改采样频率
默认情况下,xhprof每次都会运行,线上环境如果这么设置,会对性能有影响。
xhprof.inc.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php
$profiling = !(mt_rand()%9);
if ( $profiling ) xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
register_shutdown_function( function () use ( $profiling ) {
if ( $profiling ){
$xhprof_data = xhprof_disable();
if (function_exists('fastcgi_finish_request')){
fastcgi_finish_request();
}
include_once "/work/xhprof/xhprof_lib/utils/xhprof_lib.php" ;
include_once "/work/xhprof/xhprof_lib/utils/xhprof_runs.php" ;
$xhprof_runs = new XHProfRuns_Default();
$xhprof_runs ->save_run( $xhprof_data , 'xhprof');
}
});
|
Salin selepas log masuk
总结
本篇文章里,我们介绍了如何基于xhprof扩展来分析PHP性能,并记录到日志里,最后使用xhprof扩展自带的UI在web里展示出来。主要知识点:
安装xhprof扩展
在应用里注入xhprof
基于nginx展示分析结果
以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!
相关推荐:
php7+的php-fpm参数配置的注意事项
解决laravel-admin中select在form编辑时不能自动选中当前的值的问题
Atas ialah kandungan terperinci 使用XHProf分析PHP性能瓶颈的方法一. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!