使用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 上传文件的方法(类)
Jul 30 PHP
php 字符串函数收集
Mar 29 PHP
简单的PHP缓存设计实现代码
Sep 30 PHP
与文件上传有关的php配置参数总结
Jun 14 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
thinkphp多表查询两表有重复相同字段的完美解决方法
Sep 22 PHP
PHP中SQL查询语句的id=%d解释(推荐)
Dec 10 PHP
thinkphp中的多表关联查询的实例详解
Oct 12 PHP
php中输出json对象的值(实现方法)
Mar 07 PHP
php实现微信企业转账功能
Oct 02 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
Feb 03 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递归列出所有文件和目录的代码
2008/09/10 PHP
php 服务器调试 Zend Debugger 的安装教程
2009/09/25 PHP
PHP准确取得服务器IP地址的方法
2015/06/02 PHP
php实现转换ubb代码的方法
2015/06/18 PHP
phpstorm激活码2020附使用详细教程
2020/09/25 PHP
一直复略了的一个问题,关于表单重复提交
2007/02/15 Javascript
YUI 读码日记之 YAHOO.lang.is*
2008/03/22 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
js实现仿Windows风格选项卡和按钮效果实例
2015/05/13 Javascript
JavaScript深度复制(deep clone)的实现方法
2016/02/19 Javascript
早该知道的7个JavaScript技巧
2016/06/21 Javascript
jQuery实现自动输入email、时间和域名的方法
2016/08/24 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
详解用webpack把我们的业务模块分开打包的方法
2017/07/20 Javascript
H5实现仿flash效果的实现代码
2017/09/29 Javascript
nodejs简单实现TCP服务器端和客户端的聊天功能示例
2018/01/04 NodeJs
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
vue中$refs, $emit, $on, $once, $off的使用详解
2019/05/26 Javascript
微信小程序仿抖音短视频切换效果的实例代码
2020/06/24 Javascript
10分钟学会js处理json的常用方法
2020/12/06 Javascript
Python continue语句用法实例
2014/03/11 Python
pymongo给mongodb创建索引的简单实现方法
2015/05/06 Python
在Django框架中编写Contact表单的教程
2015/07/17 Python
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
matplotlib绘制动画代码示例
2018/01/02 Python
python面向对象多线程爬虫爬取搜狐页面的实例代码
2018/05/31 Python
Atom的python插件和常用插件说明
2018/07/08 Python
详解Django-channels 实现WebSocket实例
2019/08/22 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
详解Python高阶函数
2020/08/15 Python
python基于Kivy写一个图形桌面时钟程序
2021/01/28 Python
对Pytorch 中的contiguous理解说明
2021/03/03 Python
HTML最新标准HTML5总结(必看)
2016/06/13 HTML / CSS
公司股东合作协议书
2014/09/14 职场文书
Oracle设置DB、监听和EM开机启动的方法
2021/04/25 Oracle