PHP

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

字号+ 编辑: Snake 修订: 种花家 来源: PHP自学中心 2023-09-12 我要说两句(0)

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.soxhprof.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.wkwkk.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);

在浏览器打开输出的地址,可以看到如下结果分析页:

0000.jpg

图中的表格给出了代码的性能分析数据,分别表示:

  • 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文件中加几行代码:

阅完此文,您的感想如何?
  • 有用

    0

  • 没用

    0

  • 开心

    0

  • 愤怒

    0

  • 可怜

    0

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.交流群: PHP+JS聊天群

相关课文
  • mac开发接入微信公众号接口返回报错 cURL error 56: SSLRead() return error -9806

  • pecl安装程序时报错Array and string offset access syntax with curly braces is no longer supported

  • PHP的换行符是什么

  • 由于商家传入的H5交易参数有误,该笔交易暂时无法完成,请联系商家解决

我要说说
网上宾友点评