锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

PHP 性能分析工具 xhprof

时间:2023-01-03 09:00:00 ecpu电容

2ff34e647e2e3cdfd8dca593e17d9b0a.png

XHProf 是 facebook 开发的一个 php 扩展,用于收集 php 程序中每个函数的性能费用。收集的数据包括:内存消耗,CPU 计算时间、函数执行时间等。

下载1sudo wget https://codeload.github.com/phacility/xhprof/zip/master -O xhprof.zip

注意:

php5.4 以上版本不能存在 pecl 中下载,不支持。 github 上下载 https://github.com/facebook/xhprof。

另外 xhprof 已经很久没有更新了,到目前为止还不支持 php7。

安装1

2

3

4

5cd xhprof-master/

cd extension/

sudo /opt/bksite/php/bin/phpize

sudo ./configure --with-php-config=/opt/bksite/php/bin/php-config --enable-xhprof

sudo make && make install

修改配置 php.ini1

2

3[xhprof]

extension=xhprof.so

xhprof.output_dir=/tmp/xhprof 定义输出文件的存储位置

使用

优雅地注入

目前大部分 MVC 框架有唯一的入口文件,只需注入入口文件的开始 xhprof 的逻辑1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21require_once "/tmp/xhprof-master/xhprof_lib/utils/xhprof_lib.php";

require_once "/tmp/xhprof-master/xhprof_lib/utils/xhprof_runs.php";

xhprof_enable(XHPROF_FLAGS_CPU XHPROF_FLAGS_MEMORY);

//注册函数,在程序执行结束时执行。

register_shutdown_function(function(){

//stop profiler

$xhprof_data = xhprof_disable();

//冲刷(flush)所有响应数据都给客户端

if (function_exists('fastcgi_finish_request')) {

fastcgi_finish_request();

}

$xhprof_runs = new XHProfRuns_Default();

//save the run under a namespace "xhprof_foo"

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

});

然而,修改项目的源代码是不可避免的。事实上, php 它提供了更好的注入方法,例如保存上述逻辑 /opt/bitnami/php/etc/xhprof-inject.php,然后修改 php配置文件 php.ini1auto_prepend_file = /opt/bitnami/php/etc/xhprof-inject.php

这样所有的 php-fpm 请求的 php 自动注入文件前 /opt/bitnami/php/etc/xhprof-inject.php 文件;

如果使用Nginx也可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。1fastcgi_param PHP_VALUE "auto_prepend_file=/opt/bitnami/php/etc/xhprof-inject.php";

Laravel 局部使用项目

首先,将 xhprof-master 包中的 xhprof_lib/utils/ 下面的文件移到 Laravel 根目录下的 utils 文件夹中;1cp /tmp/xhprof-master/xhprof_lib/utils/* utils/

在 composer.json 中修改:1

2

3

4

5

6

7

8"autoload": {

"files":[

...,

"utils/xhprof_lib.php",

"utils/xhprof_runs.php"

],

...

}

执行 composer dump-autoload;

最后,在业务代码附近添加以下代码:1

2

3

4

5

6

7xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);

// 业务代码

$xhprof_data = xhprof_disable();

$xhprof_runs = new XHProfRuns_Default();

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

Web 页面查看

Nginx (环境 bitnami)1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18server {

listen 7777;

server_name localhost;

root /tmp/xhprof-master/xhprof_html;

index index.php index.html;

location ~* .php$ {

fastcgi_pass unix:/opt/bitnami/php/var/run/www.sock;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

fastcgi_index index.php;

}

include "/opt/bitnami/nginx/conf/bitnami/phpfastcgi.conf";

include "/opt/bitnami/nginx/conf/bitnami/bitnami-apps-prefix.conf";

}

支持图表查看,得安装 graphviz插件;1

2yum install -y libpng

yum install -y graphviz

页列页面表的含义:列名描述Function Name函数名

Calls调用次数

Calls%调用次数占比

Incl.Wall Time(microsec)函数运行时间(包括子函数)

IWall%函数运行时间(包括子函数)

Excl.Wall Time(microsec)函数运行时间(不包括子函数)

EWall%函数运行时间(不包括子函数)

Incl.CPU(microsec)执行函数的费用 CPU 时间(包括子函数)

ICpu执行%函数的费用 CPU 时间(包括子函数)的比例

Excl.CPU(microsec)执行函数的费用 CPU 时间(不包括子函数)

ECpu执行%函数的费用 CPU 时间(不包括子函数)的比例

Incl.MemUse(bytes)函数执行占用的内存(包括子函数)

IMemUse%函数占内存(包括子函数)的比例

Excl.MemUse(bytes)函数执行占用的内存(不包括子函数)

EMemUse%函数执行占用的内存(不包括子函数)占比

Incl.PeakMemUse(bytes)Incl.MemUse 峰值

IPeakMemUse%Incl.MemUse 峰值占比

Excl.PeakMemUse(bytes)Excl.MemUse 峰值

EPeakMemUse%Excl.MemUse 峰值占比

xhprof 数据保存

注入代码后我们还需要实现保存 xhprof 数据以及展示数据的 UI,听起来似乎又是一大堆工作,有现成的轮子可以用吗?

经过搜索和比较,貌似比较好的选择有 xhprof.io 以及 xhpgui。

两个项目做得事情差不多,都提供了 xhprof 数据保存功能以及一套索引展示数据的 UI,下面是一些比较

xhprof.io✗ 年久失修

✗ 保存xhprof数据到MySQL

✓ 支持域名、URI等多个维度的数据索引

✓ 函数调用记录完整,内核级别函数都能显示

✗ 无法针对个别URI开启

✗ 注入被分割成两个文件,如果程序被强制中断时xhprof数据将无法收集

xhgui✓ 保存xhprof数据到MongoDB

✗ 不支持域名索引

✗ 函数调用记录不完整,部分内核级别函数(如扩展内)无法显示

✓ 有配置文件可以控制开启条件

✓ 注入只有一个文件

✓ 狂拽酷炫的基于D3.js的调用关系动态图

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章