使用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 开发环境配置(Zend Studio)
Apr 28 PHP
php下保存远程图片到本地的办法
Aug 08 PHP
PHP中英混合字符串截取函数代码
Jul 17 PHP
PHP和.net中des加解密的实现方法
Feb 27 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
PHP使用glob函数遍历目录或文件夹的方法
Dec 16 PHP
CI框架数据库查询之join用法分析
May 18 PHP
php抛出异常与捕捉特定类型的异常详解
Oct 26 PHP
PHP简单实现模拟登陆功能示例
Sep 15 PHP
搜索附近的人PHP实现代码
Feb 11 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
May 14 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
Oct 08 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 explode()函数用法、切分字符串
2012/10/03 PHP
PHP Switch 语句之学习笔记
2013/09/21 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
php打造智能化的柱状图程序,用于报表等
2015/06/19 PHP
PHP 多任务秒级定时器的实现方法
2018/05/13 PHP
PDO::commit讲解
2019/01/27 PHP
不用ajax实现点击文字即可编辑的方法
2007/12/16 Javascript
javascript 处理HTML元素必须避免使用的一种方法
2009/07/30 Javascript
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
Js数组排序函数sort()介绍
2015/06/08 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
js仿搜狐视频记录片列表展示效果
2020/05/30 Javascript
vue复合组件实现注册表单功能
2017/11/06 Javascript
JS实现登录页密码的显示和隐藏功能
2017/12/06 Javascript
重学JS 系列:聊聊继承(推荐)
2019/04/11 Javascript
JavaScript实现的滚动公告特效【基于jQuery】
2019/07/10 jQuery
vue 检测用户上传图片宽高的方法
2020/02/06 Javascript
vue+echarts实现中国地图流动效果(步骤详解)
2021/01/27 Vue.js
RC4文件加密的python实现方法
2015/06/30 Python
详解python中的线程
2018/02/10 Python
python列表list保留顺序去重的实例
2018/12/14 Python
用Python解决x的n次方问题
2019/02/08 Python
使用python来调用CAN通讯的DLL实现方法
2019/07/03 Python
pytorch点乘与叉乘示例讲解
2019/12/27 Python
Python基于yaml文件配置logging日志过程解析
2020/06/23 Python
python如何求圆的面积
2020/07/01 Python
Python实现打包成库供别的模块调用
2020/07/13 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
机关办公室岗位职责
2014/04/16 职场文书
小学生勤俭节约倡议书
2015/04/29 职场文书
经典爱情感言
2015/08/03 职场文书
2016年毕业实习心得体会范文
2015/10/09 职场文书
2016中秋节晚会开场白
2015/11/26 职场文书
总结Python常用的魔法方法
2021/05/25 Python
国庆节到了,利用JS实现一个生成国庆风头像的小工具 详解实现过程
2021/10/05 Javascript