PHP性能分析工具,你在用哪一个?

PHP性能分析工具,小编一直都在用这个:Xhprof , 今天给大家介绍一下如何安装与如何使用,注意事项等!也许你会用得着的。

什么是Xhprof

Xhprof是一个轻量级的分层性能测量分析器。在数据收集阶段,它跟踪调用次数与测量数据,展示程序动态调用的弧线图。它在报告、后期处理阶段计算了独占的性能度量,例如运行经过的时间、CPU 计算时间和内存开销。

Xhprof包含了一个基于 HTML 的简单用户界面(由 PHP 写成),可以方便地浏览性能分析报告,这对理解代码执行结构常常很有帮助。

安装

Xhprof是PHP的一个扩展,所以只需要按照PHP扩展的编译安装方法来安装即可。

1、下载扩展包

支持PHP 7+的Xhprof扩展包:https://github.com/longxinH/xhprof

wgethttps://github.com/longxinH/xhprof/archive/v2.2.0.tar.gz

2、解压编译

PHP扩展编译三部曲:phpize、configure、make。

nbsp;tarxzfxhprof-2.2.0.tar.gz

nbsp;cdxhprof-2.2.0/extension

nbsp;/usr/local/services/php7/bin/phpize

nbsp;./configure--prefix=/usr/local/services/php7/lib/php/extensions/no-debug-zts-20160303--with-php-config=/usr/local/services/php7/bin/php-config

nbsp;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{

listen80;

server_namexhprof.report.com;

root/data/release/xhprof_project/xhprof_html;

indexindex.phpindex.html;

location~*.phpnbsp;{

includefastcgi_params;

fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;

fastcgi_pass127.0.0.1:9000;

fastcgi_indexindex.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=newXHProfRuns_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接口

publicfunctiontestApi(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=newXHProfRuns_Default();

$run_id=$xhprof_runs->save_run($xhprof_data,"xhprof_foo");

//=====================================

returnjson_encode(true);

}

//私有方法

privatefunctionbar($num){

if($num>0){

$this->bar($num-1);

}

}这种方法显然是最麻烦的。

方法二:封装Helper

封装成Helper放在app/Helpers目录下,使用XhprofHelper::beginXhprof()、XhprofHelper::endXhprof()方法嵌入接口。

XhprofHelper如下:

<?php

namespaceAppHelpers;

classXhprofHelper

{

constXHPROF_ROOT='/data/release/xhprof_project';

/**

*开始分析

*@returnmixed

*/

staticpublicfunctionbeginXhprof()

{

xhprof_enable(XHPROF_FLAGS_CPU|XHPROF_FLAGS_MEMORY);

return;

}

/**

*停止分析

*@returnmixed

*/

staticpublicfunctionendXhprof()

{

$xhprof_data=xhprof_disable();

//导入两个库文件

include_onceself::XHPROF_ROOT."/xhprof_lib/utils/xhprof_lib.php";

include_onceself::XHPROF_ROOT."/xhprof_lib/utils/xhprof_runs.php";

//保存这次分析的结果数据

$xhprof_runs=newXHProfRuns_Default();

$run_id=$xhprof_runs->save_run($xhprof_data,"api_demo");

return$run_id;

}

}

然后可以在代码中使用:

//API接口

publicfunctiontestApi(Request$request){

XhprofHelper::beginXhprof();

for($i=0;$i<5;$i++){

$this->bar($i);

$len=strlen("songlee");

}

XhprofHelper::endXhprof();

returnjson_encode(true);

}

方法三:在入口文件index.php中注入

将方法二中封装的 XhprofHelper 文件放到入口文件所在的public目录下,然后在index.php文件中加几行代码:

<?php

/*

|--------------------------------------------------------------------------

|CreateTheApplication

|--------------------------------------------------------------------------

|

*/

$app=require__DIR__.'/../bootstrap/app.php';

/*

|--------------------------------------------------------------------------

|RunTheApplication

|--------------------------------------------------------------------------

|

*/

require_once'./XhprofHelper.php';

MyHelpersXhprofHelper::beginXhprof();

$app->run();

MyHelpersXhprofHelper::endXhprof();

但是这种方式分析的不仅仅只是业务代码,而是从Laravel项目启动到调用结束为止,整个调用链很长。

相关文章

文章浏览阅读8.4k次,点赞8次,收藏7次。SourceCodester Onl...
文章浏览阅读3.4k次,点赞46次,收藏51次。本文为大家介绍在...
文章浏览阅读1.1k次。- php是最优秀, 最原生的模板语言, 替代...
文章浏览阅读1.1k次,点赞18次,收藏15次。整理K8s网络相关笔...
文章浏览阅读1.2k次,点赞22次,收藏19次。此网络模型提供了...
文章浏览阅读1.1k次,点赞14次,收藏19次。当我们谈论网络安...