PHP XHProf 性能分析

| 选择喜欢的代码风格  

它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。

XHProf 分析报告有助于理解被执行的代码的结构,它有一个简单的HTML的用户界面( PHP写成的)。

基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。

也能绘制调用关系图。

XHProf 与 XDebug 区别


XDebug 是一个开放源代码的PHP程序调试器(即一个Debug工具)。

对于本地开发环境来说,进行性能分析 XDebug 是够用了。

但如果是线上环境的话,XDebug 消耗较大,配置也不够灵活

安装 XHProf


//源码安装
cd /usr/local/src
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar zxvf xhprof-0.9.4.tgz
cd xhprof-0.9.4/extension/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config
make
make install

//在 php.ini 末尾新增
[xhprof]

extension = xhprof.so

xhprof.output_dir = 自定义文件夹(/tmp/xhprof_log)
# /tmp/xhprof_log 必须存在且有写入权限
# 如果不加存放目录的话,默认是放在/tmp下面 

# 重启 php-fpm 环境

如果PHP安装在了其他位置,可以用 php --ini 来探测

#要修改PHP的配置首先需要知道配置文件在什么位置,
#这里可以通过PHP的命令来查看配置文件存放位置,参考命令如下:
[root@Dev_Test bin]$php --ini
Configuration File (php.ini) Path: /Data/apps/php-7.2.8/etc
Loaded Configuration File:         /Data/apps/php-7.2.8/etc/php.ini
Scan for additional .ini files in: (none)
Additional .ini files parsed:      (none)

#验证XHProf模块安装成功与否
php -m | grep xhprof

配置 XHProf


//比如项目地址:local.test_xhprof.com
//在项目入口文件中新增一下代码(CI框架为例)
//启动xhprof  
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS +
              XHPROF_FLAGS_CPU +
              XHPROF_FLAGS_MEMORY);

register_shutdown_function(function(){
    $data = xhprof_disable();   //返回运行数据
    //xhprof_lib 在下载的包里存在这个目录,记得将目录包含到运行的php代码中
    include '/home/www/mi/xhprof/xhprof_lib/utils/xhprof_lib.php';
    include '/home/www/mi/xhprof/xhprof_lib/utils/xhprof_runs.php';
    $objXhprofRun = new XHProfRuns_Default();
    $objXhprofRun->save_run($data, "test"); //test 表示文件后缀
});

//一切顺利的话,那么代码安装成功。

//访问:local.test_xhprof.com,应该在 /tmp/xhprof_log 存在日志文件。

XHProf UI 展示


//将 xhprof_html、xhprof_lib 拷贝到虚拟目录中
cd /usr/local/src
cp xhprof-0.9.4/xhprof_html /home/www/mi/xhprof/xhprof_html
cp xhprof-0.9.4/xhprof_lib /home/www/mi/xhprof/xhprof_lib

配置虚拟主机(local.xhprof.com)

local.xhprof.com 指向 /home/www/mi/xhprof/ 即可。

访问:local.xhprof.com/xhprof_html 会显示日志文件。

如果要生成图,那在生成图的时候需要服务器装一个插件:graphviz

cd /usr/local/src
wget http://www.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

报错:failed to execute cmd " dot -Tpng",表示:php.ini 中一些执行函数禁用了。在 php.ini 中 去掉 disable_functions 中的如下函数

system
shell_exec
proc_open
proc_get_status

#重启PHP

以上,大家可以看到 PHP 函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。

扩展阅读

XHProf + PHP 实例


<?php  
function bar($x) {  
 if ($x > 0) {  
 bar($x -1);  
 }  
}  
function foo() {  
 for ($idx = 0; $idx < 5; $idx++) {  
 bar($idx);  
 $x = strlen("abc");  
 }  
}  
 
//启动xhprof  
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);  
 
//调用foo函数,也是我们要分析的函数  
foo();  
 
//停止xhprof  
$xhprof_data = xhprof_disable();  
 
//取得统计数据  
print_r($xhprof_data);  
 
$XHPROF_ROOT = realpath(dirname(__FILE__) . '/..');  
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";  
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";  
 
//保存统计数据,生成统计ID和source名称  
$xhprof_runs = new XHProfRuns_Default();  
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo"); //source名称是xhprof_foo  
 
//查看统计信息  
header("Location: ../xhprof_html/index.php?run=".$run_id."&source=xhprof_foo";  
?>

以下是部分的结果:

[foo==>bar] => Array  
 (  
 [ct] => 5       //bar()这个函数被调用了5次  
 [wt] => 63      //每次运行bar()所要的时间,不知道这个是不是平均值  
 [cpu] => 0      //每次运行bar(),cpu运算时间  
 [mu] => 2860    //每次运行bar(),php所使用内存的改变  
 [pmu] => 0      //每次运行bar(),php在内存使用最高峰时,所使用内存的改变  
 ) 


发表评论