文章来自:https://blog.csdn.net/lisonglisonglisong/article/details/84929602
商务合作: 请加微信 2230304070
IT技术交流群
我们在学习技术中单枪匹马,还不如一次短短的交流,你可以在别人吸取各种学习经验,学习方法以及学习技巧。所以,学习与交流少不了一个圈子,提升你的学习技能,请点击加技术群:IT技术交流微信群精选文章正文
PHP性能分析工具,小编一直都在用这个:Xhprof , 今天给大家介绍一下如何安装与如何使用,注意事项等!也许你会用得着的。
什么是Xhprof
Xhprof
是一个轻量级的分层性能测量分析器。在数据收集阶段,它跟踪调用次数与测量数据,展示程序动态调用的弧线图。它在报告、后期处理阶段计算了独占的性能度量,例如运行经过的时间、CPU 计算时间和内存开销。
Xhprof
包含了一个基于 HTML 的简单用户界面(由 PHP 写成),可以方便地浏览性能分析报告,这对理解代码执行结构常常很有帮助。
安装
Xhprof
是PHP的一个扩展,所以只需要按照PHP扩展的编译安装方法来安装即可。
1、下载扩展包
支持PHP 7+的Xhprof
扩展包:https://github.com/longxinH/xhprof
wget https://github.com/longxinH/xhprof/archive/v2.2.0.tar.gz
2、解压编译
PHP扩展编译三部曲:phpize
、configure
、make
。
$ tar xzf xhprof-2.2.0.tar.gz
$ cd xhprof-2.2.0/extension
$ /usr/local/services/php7/bin/phpize
$ ./configure --prefix=/usr/local/services/php7/lib/php/extensions/no-debug-zts-20160303 --with-php-config=/usr/local/services/php7/bin/php-config
$ make
然后就可以在当前的
modules
目录下看到编译生成的
so
文件,将它拷贝到扩展目录。
注:安装autoconf库:
yum -y install autoconf
3、配置php.ini
在php的配置文件中添加两行配置,并重启php-fpm:
extension=xhprof.so
xhprof.output_dir=/data/release/xhprof_project/output
其中xhprof.output_dir
用于指定存储xhprof分析数据的目录。
二、创建Xhprof项目
1、创建目录
mkdir /data/release/xhprof_project
2、将相关文件拷贝到目录下
cp -r /data/software/xhprof-2.2.0/xhprof_html /data/release/xhprof_project/
cp -r /data/software/xhprof-2.2.0/xhprof_lib /data/release/xhprof_project/
3、添加nginx访问配置
server {listen 80;server_name xhprof.report.com;root /data/release/xhprof_project/xhprof_html;index index.php index.html;location ~* \.php$ {include fastcgi_params;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;
}
}
三、如何使用
在PHP脚本中使用的模式如下:
<?php // 开始分析
xhprof_enable();// 你的代码// 停止分析
$xhprof_data = xhprof_disable();// 导入两个库文件
$XHPROF_ROOT = "/data/release/xhprof_project";include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";// 保存这次分析的结果数据
$xhprof_runs = new XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");// 查看地址echo "http://xhprof.report.com/index.php?run=$run_id&source=xhprof_foo"
默认只会分析代码的耗时,可以通过传参控制是否分析代码的memory和CPU性能数据:
xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
在浏览器打开输出的地址,可以看到如下结果分析页:
图中的表格给出了代码的性能分析数据,分别表示:
Funciton Name
:函数名Calls
:调用次数Calls%
:调用占比Incl. Wall Time (microsec)
:函数运行时间(包括子函数)IWall%
:函数运行时间(包括子函数)占比Excl. Wall Time(microsec)
:函数运行时间(不包括子函数)EWall%
:函数运行时间(不包括子函数)占比
点击页面中[View Full Callgraph]
链接,可以绘制出一张可视化的性能分析图。如果点击后报错failed to execute cmd:" dot -Tpng". stderr:sh:dot:command not found
,可能是缺少依赖库graphviz
,安装即可。
四、在Laravel项目中使用
方法一:直接使用
直接嵌在接口函数的开始和结束处:
// API接口public function testApi(Request $request) {// =============API开始处================
xhprof_enable();// =====================================for ($i=0; $i<5; $i++) {$this->bar($i);
$len = strlen("songlee");
}// =============API结束处================
$xhprof_data = xhprof_disable();
$XHPROF_ROOT = "/data/release/xhprof_project";include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new \XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");// =====================================return json_encode(true);
}// 私有方法private function bar($num) {if ($num > 0) {$this->bar($num - 1);
}
}
这种方法显然是最麻烦的。
方法二:封装Helper
封装成Helper放在app/Helpers
目录下,使用XhprofHelper::beginXhprof()
、XhprofHelper::endXhprof()
方法嵌入接口。
XhprofHelper
如下:
<?php namespace App\Helpers;class XhprofHelper
{const XHPROF_ROOT = '/data/release/xhprof_project';/**
* 开始分析
* @return mixed
*/static public function beginXhprof(){
xhprof_enable(XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);return ;
}/**
* 停止分析
* @return mixed
*/static public function endXhprof(){
$xhprof_data = xhprof_disable();// 导入两个库文件include_once self::XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";include_once self::XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php";// 保存这次分析的结果数据
$xhprof_runs = new \XHProfRuns_Default();
$run_id = $xhprof_runs->save_run($xhprof_data, "api_demo");return $run_id;
}
}
然后可以在代码中使用:
// API接口public function testApi(Request $request) {
XhprofHelper::beginXhprof();for ($i=0; $i<5; $i++) {$this->bar($i);
$len = strlen("songlee");
}
XhprofHelper::endXhprof();return json_encode(true);
}
方法三:在入口文件index.php
中注入
将方法二中封装的 XhprofHelper 文件放到入口文件所在的public
目录下,然后在index.php
文件中加几行代码:
<?php /*
|--------------------------------------------------------------------------
| Create The Application
|--------------------------------------------------------------------------
|
*/
$app = require __DIR__.'/../bootstrap/app.php';/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
*/require_once './XhprofHelper.php';
\MyHelpers\XhprofHelper::beginXhprof();
$app->run();
\MyHelpers\XhprofHelper::endXhprof();
但是这种方式分析的不仅仅只是业务代码,而是从Laravel项目启动到调用结束为止,整个调用链很长。
以上是本文的全部内容,希望对大家的学习有帮助,也希望大家多多支持php自学中心