使用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 09 PHP
Snoopy类使用小例子
Apr 15 PHP
PHP Socket 编程
Apr 09 PHP
php与paypal整合方法
Nov 28 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
php微信公众开发之获取周边酒店信息的方法
Dec 22 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
php提交post数组参数实例分析
Dec 17 PHP
php $_SESSION会员登录实例分享
Jan 19 PHP
Yii2中OAuth扩展及QQ互联登录实现方法
May 16 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
laravel 解决Validator使用中出现的问题
Oct 25 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
php标签云的实现代码
2012/10/10 PHP
php多个文件及图片上传实例详解
2014/11/10 PHP
PHP+原生态ajax实现的省市联动功能详解
2017/08/15 PHP
PHP Laravel 上传图片、文件等类封装
2017/08/16 PHP
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
javascript函数作用域学习示例(js作用域)
2014/01/13 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
javaScript中两个等于号和三个等于号之间的区别介绍
2014/06/27 Javascript
原生Javascript封装的一个AJAX函数分享
2014/10/11 Javascript
深入浅出ES6之let和const命令
2016/08/25 Javascript
Angular.js中$apply()和$digest()的深入理解
2016/10/13 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
学习jQuery中的noConflict()用法
2018/09/28 jQuery
react 兄弟组件如何调用对方的方法示例
2018/10/23 Javascript
Webpack4+Babel7+ES6兼容IE8的实现
2019/04/10 Javascript
Vue中错误图片的处理的实现代码
2019/11/07 Javascript
vue-preview动态获取图片宽高并增加旋转功能的实现
2020/07/29 Javascript
[01:32]2016国际邀请赛中国区预选赛CDEC战队教练采访
2016/06/26 DOTA
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
python 将json数据提取转化为txt的方法
2018/10/26 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
Madewell美德威尔美国官网:美国休闲服饰品牌
2016/11/25 全球购物
如何查找网页漏洞
2016/06/22 面试题
C#中类(class)与结构(struct)的异同
2013/11/03 面试题
大学感恩节活动策划方案
2014/10/11 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
寒假安全保证书
2015/02/28 职场文书
中学生自我评价2015
2015/03/03 职场文书
2015个人简历自我评价语
2015/03/11 职场文书
大学生入党自传2015
2015/06/26 职场文书
MySQL安装后默认自带数据库的作用详解
2021/04/27 MySQL