使用XHProf查找PHP性能瓶颈的实例


Posted in PHP onDecember 13, 2017

XHProf是facebook 开发的一个测试php性能的扩展,本文记录了在PHP应用中使用XHProf对PHP进行性能优化,查找性能瓶颈的方法。

一、安装Xhprof扩展

//github上下载https://github.com/facebook/xhprof
unzip xhprof-master.zip 
cd xhprof-master/extension/
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --enable-xhprof
make && make install

二、修改php.ini

[xhprof]
extension=xhprof.so
xhprof.output_dir=/tmp

配置中xhprof.output_dir指定了生成的profile文件存储的位置,我们将其指定为/tmp。

三、将相关文件移动项目中

//xhprof下载压缩包中的xhprof_html和xhprof_lib
cp -r xhprof-master/xhprof_html /usr/local/nginx/html/xhprof/
cp -r xhprof-master/xhprof_lib /usr/local/nginx/html/xhprof/

配置一个域名,浏览器可以访问到 http://will.com/xhprof/xhprof_html/index.php

server{
 listen 80;
 server_name will.com;
 location / {
  root /usr/local/nginx/html;
  index index.html;
 }
 location ~ \.php$ {
  root html;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include  fastcgi_params;
 }
 }

四、安装graphivz

//需要安装graphviz否则查看性能图片时候会报failed to execute cmd: " dot -Tpng". stderr: `sh: dot: command not found '
yum -y install graphviz

五、编写测试文件

//入口文件的开始位置
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);

业务逻辑...

//业务逻辑结束后
$xhprof_data = xhprof_disable();
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php"; 
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php"; 
$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中 
$run_id = $objXhprofRun->save_run($xhprof_data, "test");

完整代码示例(随机满减红包demo)

<?php
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
function show($info)
{
 echo "<pre>";
 print_r($info);
}

//不作数据校验
$rules = array(
 2=>array('min'=>1, 'max'=>10, 'chance'=>30),//金额:分 概率:百分之(默认为100%,不足100%按第一档计算)
 array('min'=>11, 'max'=>25, 'chance'=>60),
 array('min'=>26, 'max'=>50, 'chance'=>10),
 array('min'=>50, 'max'=>80, 'chance'=>0),
 array('min'=>80, 'max'=>100, 'chance'=>0),
);
$total_money = 10000;//红包总金额
$res = array();
while($total_money>0)
{
 $index = getLevel($rules);
 $money = setMoney($rules, $index);
 if ($money > $total_money)//金额不足
 {
 $money = $total_money;
 $total_money = 0;
 } else {
 $total_money -= $money;
 }
 $res[] = ($index+1)."---".$money;
}
echo show($res);
echo $total_money . "<br/>";
//1.先确定档次
function getLevel($rules)
{
 $level = array();
 $chance = 0;
 foreach($rules as $k=>$v)
 {
 if ($v['chance']>0)
 {
  $chance += $v['chance']*100;//扩大100倍
  $level[$k] = $chance;
 }
 }
 $index = 0;
 $rand_num = mt_rand(1, 10000);
 foreach($level as $k=>$v)
 {
 if ($rand_num <= $v)
 {
  $index = $k;
  break;
 }
 }
 return $index;
}
//2.确定档次之后,再确定金额
function setMoney($rules, $index)
{
 $money = mt_rand($rules[$index]['min']*10000, $rules[$index]['max']*10000)/10000;
 $money = ceil($money);
 $money > 1 && $money = $money -1;//防止出现免单情况
 return $money;
}
$xhprof_data = xhprof_disable();
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_lib.php"; 
include_once "/usr/local/nginx/html/xhprof/xhprof_lib/utils/xhprof_runs.php"; 
$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中 
$run_id = $objXhprofRun->save_run($xhprof_data, "test");
echo "http://will.com/xhprof/xhprof_html/index.php?run=$run_id&source=test";//变量$runId是本次请求生成分析结果的id,最后我们输出了一个链接地址,使用改地址就可以看到本次请求的分析结果。

六、查看分析结果

先运行业务代码;

然后浏览器打开 http://will.com/xhprof/xhprof_html/index.php, 点击最后一次生成xhprof文件

使用XHProf查找PHP性能瓶颈的实例

注意到中间的View Full Callgraph链接,通过该链接我们可以看到图形化的分析结果

使用XHProf查找PHP性能瓶颈的实例

图中红色的部分为性能比较低,耗时比较长的部分,我们可以根据根据哪些函数被标记为红色对系统的代码进行优化

另外附上, xhprof报告字段含义:

Function Name:方法名称。

Calls:方法被调用的次数。

Calls%:方法调用次数在同级方法总数调用次数中所占的百分比。

Incl.Wall Time(microsec):方法执行花费的时间,包括子方法的执行时间。(单位:微秒)

IWall%:方法执行花费的时间百分比。

Excl. Wall Time(microsec):方法本身执行花费的时间,不包括子方法的执行时间。(单位:微秒)

EWall%:方法本身执行花费的时间百分比。

Incl. CPU(microsecs):方法执行花费的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查找PHP性能瓶颈的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP教程 预定义变量
Oct 23 PHP
在VS2008中编译MYSQL5.1.48的方法
Jul 03 PHP
php在文件指定行中写入代码的方法
May 23 PHP
PHP针对常规模板引擎中与CSS/JSON冲突的解决方法
Aug 19 PHP
PHP curl CURLOPT_RETURNTRANSFER参数的作用使用实例
Feb 07 PHP
ecshop 2.72如何修改后台访问地址
Mar 03 PHP
PHP获取音频文件的相关信息
Jun 22 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
PHP分页显示的方法分析【附PHP通用分页类】
May 10 PHP
PHP常用日期加减计算方法实例小结
Jul 31 PHP
php实现在线考试系统【附源码】
Sep 18 PHP
PHP序列化和反序列化深度剖析实例讲解
Dec 29 PHP
PHP让数组中有相同值的组成新的数组实例
Dec 31 #PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 #PHP
php中通用的excel导出方法实例
Dec 30 #PHP
利用Laravel生成Gravatar头像地址的优雅方法
Dec 30 #PHP
PHP如何实现订单的延时处理详解
Dec 30 #PHP
PHP 的Opcache加速的使用方法
Dec 29 #PHP
PHP自定义序列化接口Serializable用法分析
Dec 29 #PHP
You might like
2014过年倒计时示例
2014/01/31 PHP
php获取目标函数执行时间示例
2014/03/04 PHP
基于php实现七牛抓取远程图片
2015/12/01 PHP
php和html的区别点详细总结
2019/09/24 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
数组方法解决JS字符串连接性能问题有争议
2011/01/12 Javascript
淘宝搜索框效果实现分析
2011/03/05 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
2012/07/31 Javascript
JQuery each打印JS对象的方法
2013/11/13 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
javascript实现锁定网页、密码解锁效果(类似系统屏幕保护效果)
2014/08/15 Javascript
jQuery中的insertBefore(),insertAfter(),after(),before()区别介绍
2016/09/01 Javascript
jQuery设置图片等比例缩小的方法
2017/04/29 jQuery
Kotlin学习第一步 kotlin语法特性
2017/05/25 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
小程序兼容安卓和IOS数据处理问题及坑
2018/09/18 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
python构造icmp echo请求和实现网络探测器功能代码分享
2014/01/10 Python
使用70行Python代码实现一个递归下降解析器的教程
2015/04/17 Python
python用pickle模块实现“增删改查”的简易功能
2017/06/07 Python
PyQt4 treewidget 选择改变颜色,并设置可编辑的方法
2019/06/17 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
制药工程专业应届生求职信
2013/09/24 职场文书
咖啡书吧创业计划书
2014/01/13 职场文书
优良学风班总结材料
2014/02/08 职场文书
残疾人小组计划书
2014/04/27 职场文书
社保委托书怎么写
2014/08/02 职场文书
公共场所禁烟倡议书
2014/08/30 职场文书
专题组织生活会发言材料
2014/10/17 职场文书
信用卡工资证明范本
2014/10/17 职场文书
个人工作表现自我评价
2015/03/06 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
爱护环境卫生倡议书
2015/04/29 职场文书
opencv用VS2013调试时用Image Watch插件查看图片
2021/07/26 Python