安装:

到pecl官网下载xhprof的最新版:http://pecl.php.net/package/xhprof

wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar zxvf xhprof-0.9.4.tgz
cd xhprof-0.9.4
#拷贝这两个目录到一个可访问的host下
cp -r xhprof_html xhprof_lib /var/www/xhprof
cd extension
which php-config #记录下php-config的路径,接下来要用。
phpize
./configure --with-php-config=/usr/bin/php-config #此处的地址就是上面你记录下来php-config的地址
make
make install

修改php.ini

[xhprof]
extension=xhprof.so
;
;xhprof生成的文件存放路径。
;记得目录有可写权限,否则文件无法生成,xhprof也不报错,这个问题我犯了错误了。
;另外,这个目录不是要配置host访问的目录,host的目录还是xhprof_html,往下看就明白了
;xhprof.output_dir=<directory_for_storing_xhprof_runs>
;
xhprof.output_dir=/tmp

重启php-fpm就OK了,不过为了显示效果更炫,最好继续安装Graphviz。

安装Graphviz的目的是为了xhprof图形化web工具查看profiling log文件。

wget http://www.graphviz.org/pub/graphviz/stable/SOURCES/graphviz-2.24.0.tar.gz
tar zxf graphviz-2.24.0.tar.gz
cd graphviz-2.24.0
./configure
make
make install

使用:

// start profiling
xhprof_enable();
// run program // stop profiler
$xhprof_data = xhprof_disable(); // Saving the XHProf run
// using the default implementation of iXHProfRuns.
//
$XHPROF_ROOT = "/var/www/xhprof";//需要include下边的两个文件,路径就是上边cp时写的路径
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_lib.php";
include_once $XHPROF_ROOT . "/xhprof_lib/utils/xhprof_runs.php"; $xhprof_runs = new XHProfRuns_Default(); // 保存运行结果在xhprof_foo下,类似命名空间
// **NOTE**:
//save_run返回一个唯一的run_id,也可以通过参数自己指定id.
$run_id = $xhprof_runs->save_run($xhprof_data, "xhprof_foo");

//输出连接到页面,点击页面中的连接访问
echo "http://<xhprof-ui-address>/xhprof_html/index.php?run=$run_id&source=xhprof_foo\n".

如此一来,会在上面设定的xhprof.output_dir目录里生成名字类似49bafaa3a3f66.xhprof_foo的数据文件。

可以很方便的通过Web方式浏览效果:

http://www.v.com/xhprof_html/index.php?run=49bafaa3a3f66&source=xhprof_foo

分析:

$xhprof_data中记录了程序单步运行过程中所有的函数调用时间及CPU内存消耗等,具体记录哪些指标可以通过xhprof_enable的入口参数控制,之后的处理已经与xhprof扩展无关,大致是编写了一个存储类XHProfRuns_Default,将$xhprof_data序列化并保存到某个目录,可以通过XHProfRuns_Default(__DIR__)将结果输出到当前目录,如果不指定则会读取php.ini配置文件中的xhprof.output_dir,仍然没有指定则会输出到/tmp

xhprof_html/index.php将记录的结果整理并可视化,默认的UI里列出了:

主要的:

Inclusive Time (或子树时间):包括子函数所有执行时间。
Exclusive Time/Self Time:函数执行本身花费的时间,不包括子树执行时间。
Wall时间:花去了的时间或挂钟时间。
CPU时间:用户耗的时间+内核耗的时间。

表格中的:

Function Name 函数名
Calls 调用次数
Calls% 调用百分比
Incl. Wall Time (microsec) 调用的包括子函数所有花费时间 以微秒算(一百万分之一秒)
IWall% 调用的包括子函数所有花费时间的百分比
Excl. Wall Time (microsec) 函数执行本身花费的时间,不包括子树执行时间,以微秒算(一百万分之一秒)
EWall% 函数执行本身花费的时间的百分比,不包括子树执行时间
Incl. CPU(microsecs) 调用的包括子函数所有花费的cpu时间。减Incl. Wall Time即为等待cpu的时间
ICpu% Incl. CPU(microsecs)的百分比
Excl. CPU(microsec) 函数执行本身花费的cpu时间,不包括子树执行时间,以微秒算(一百万分之一秒)。
ECPU% Excl. CPU(microsec)的百分比
Incl.MemUse(bytes) 包括子函数执行使用的内存。
IMemUse% Incl.MemUse(bytes)的百分比
Excl.MemUse(bytes) 函数执行本身内存,以字节算
EMemUse% Excl.MemUse(bytes)的百分比
Incl.PeakMemUse(bytes) Incl.MemUse的峰值
IPeakMemUse% Incl.PeakMemUse(bytes) 的峰值百分比
Excl.PeakMemUse(bytes) Excl.MemUse的峰值
EPeakMemUse% EMemUse% 峰值百分比

xhprof_html/index.php中还可以看到[View Full Callgraph]链接,点击后可以绘制出一张可视化的性能分析图,如果点击后报错的话,可能是缺少依赖graphviz

xhprof_enable()参数:
 
注意:默认情况下只有调用次数和占用时间是记录了的。您也可以选择同时记录CPU时间和/或单纯记录内存使用量。这样:
 
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); 

同时在分析时去掉内置函数:

xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);

忽略指定的函数( 0.9.2或更高版本支持):

xhprof_enable(
0,
array('ignored_functions' => array('call_user_func',
'call_user_func_array')));

同时记录内存:

xhprof_enable(
XHPROF_FLAGS_MEMORY,
array('ignored_functions' =>array(
                    'call_user_func',
                   'call_user_func_array')
));

查看不同的XHProf用户界面:

PHP源码目录结构XHProf的用户界面的由PHP实现。代码存放在两个子目录中: xhprof_html/和xhprof_lib/ 。xhprof_html目录包含了3个顶级PHP页面。

index.php :查看一个单一运行或差异报告。

callgraph.php :以图片的形式查看一次XHProf运行的调用关系图。

typeahead.php :在XHProf的报告中被后台调用来进行函数的自动补全。

查看diff报告:

要查看命名空间<namespace>下runid分别是< run_id1>和<run_id2>的两个报告,访问URL:

http://<xhprof-ui-address>/index.php?run1=<run_id1>&run2=<run_id2>&source=<namespace>

汇总报告:

您也可以指定一组run id来汇总得到您想要的报告视图。

如果你有三个XHProf运行,都在"benchmark‘命名空间下,run id分别是1,2,3。要查看这些运行的汇总报告:

http://<xhprof-ui-address>/index.php?run=1,2,3&source=benchmark

加权汇总 :

进一步假设,上述3个运特分别对应三种程序,p1.php,p2.php和p3.php ,通常以20%,30%,50%概率混合:要查看汇总报告所对应的加权平均数这些运行使用:

http://<xhprof-ui-address>/index.php?run=1,2,3&wts=20,30,50&source=benchmark

取样分析(自己实现和xhprof实现):

不想每个请求都进行分析,自己通过随机数方式取样。

$randKey = mt_rand(1, 10000);
if ($randKey == 1)
{
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
} // Test Code Start
……
// Test Code End if ($randKey == 1)
{
$xhprofData = xhprof_disable(); include_once "/data/zivn.me/xhprof_lib/utils/xhprof_lib.php";
include_once "/data/zivn.me/xhprof_lib/utils/xhprof_runs.php"; $xhprofRuns = new XHProfRuns_Default();
$xhprofRuns->save_run($xhprofData, "xhprof");
}

Xhprof扩展还提供了一个轻量级采样模式 。采样间隔为0.1秒。采样记录了整个函数调用堆栈。如果想以增加极低的负载作代价来进行性能监控和诊断,采样模式就是你想要的。用xhprof_sample_enable()和xhprof_sample_disable()代替xhprof_enable()和xhprof_disable() 即可。

更好的注入方式:

理解了上边的配置和使用后,其实就已经可以将xhprof整合到任何我们已有的项目中去了。目前大部分MVC框架都有唯一的入口文件,只需要在入口文件的开始处注入xhprof的逻辑

//开启xhprof
xhprof_enable(XHPROF_FLAGS_MEMORY | XHPROF_FLAGS_CPU);
//在程序结束后收集数据
register_shutdown_function(function() {
$xhprof_data = xhprof_disable(); //让数据收集程序在后台运行
if (function_exists('fastcgi_finish_request')) {
fastcgi_finish_request();
} //保存xhprof数据
...
});

但是这样免不了要修改项目的源代码,其实php本身就提供了更好的注入方式,比如将上述逻辑保存为/opt/inject.php,然后修改php fpm配置文件

vi /etc/php5/fpm/php.ini

修改auto_prepend_file配置:

auto_prepend_file = /opt/inject.php

这样所有的php-fpm请求的php文件前都会自动注入/opt/inject.php文件

如果使用Nginx的话,还可以通过Nginx的配置文件设置,这样侵入性更小,并且可以实现基于站点的注入。

fastcgi_param PHP_VALUE "auto_prepend_file=/opt/inject.php";

更好的分析工具:xhprof.io还是xhpgui:

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

查看这个博客的介绍:http://avnpc.com/pages/profiler-php-performance-online-by-xhprof

xhprof安装使用的更多相关文章

  1. PHP性能优化工具–xhprof安装

    PHP性能优化工具–xhprof安装,这里我先贴出大致的步骤: 1.获取xhprof 2.编译前预处理 3.编译安装 4.配置php.ini 5.查看运行结果 那么下面我们开始安装xhprof工具吧: ...

  2. xhprof 安装详解

    准备工作1.xhprof不支持php7,需要php7以下版本2.php扩展模块xhprof下载地址: http://pecl.php.net/get/xhprof-0.9.4.tgz xhprof安装 ...

  3. PHP性能检测与优化—XHProf 安装

    PHP性能检测与优化—XHProf 安装 XHProf是facebook开源出来的一个php轻量级的性能分析工具,跟Xdebug类似,但性能开销更低,还可以用在生产环境中,也可以由程序开关来控制是否进 ...

  4. PHP性能测试工具xhprof安装与使用

    原文链接:http://www.orlion.ga/711/ 一.安装 wget https://pecl.php.net/get/xhprof-0.9.4.tgz tar zxf xhprof-0. ...

  5. xhprof 安装使用

    1.安装扩展 windows下把 xhprof.dll 放到extensions目录下 修改配置文件 [xhprof] extension=xhprof.so; ; directory used by ...

  6. Xhprof安装笔记(PHP性能监控)

    由facebook开源出来的一个PHP性能监控工具,占用资源很少,甚至能够在生产环境中进行部署.它可以结合graphviz使用,能够以图片的形式很直观的展示代码执行耗时 wget http://pec ...

  7. XhProf安装教程–详细教程

    wget去这里找最新的包下载,我现在最新的是xhprof-0.9.4.tgz cd /tmp mkdir xhprof && cd xhprof wget http://pecl.ph ...

  8. xhprof安装记录

    选择一个工具分析PHP函数调用的资源耗用明细,以图表化的形式展现,方便优化代码. 安装xhprof $ pecl install xhprof-beta
  在php.ini引用的extension中 ...

  9. XHProf安装使用笔记

    编译安装 获取源代码包root@sourcjoy>wget http://pecl.php.net/get/xhprof-0.9.2.tgz解压root@sourcjoy>tar zxf ...

随机推荐

  1. 【CodeVS 3153】取石子游戏

    http://codevs.cn/problem/3153/ 对于这道题,直觉告诉我每一个状态一定是必胜或必败的 然后设定操作次数t,t为取完些石子最多需要多少步. 如果\(a_i\)不为1,\(t= ...

  2. gbdt推导和代码

    GBDT算法推导过程 m次迭代,n个类别,那么就意味着学习了m*n棵回归树 train过程:假设有8个训练样本,3个类别 步骤一.假设所有样本的F矩阵,F矩阵是8*3的,F矩阵刚开始全为0,而实际每个 ...

  3. ASP.NET MVC 扩展HtmlHelper类方法

    1.扩展HtmlHelper类方法ShowPageNavigate 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 ...

  4. Win7下如何设置护眼的电脑豆沙绿界面?保护眼睛的颜色设置教程

    关爱心灵的窗户——眼睛! 随着科技发展,使用电脑的人越来越多,由于使用电脑时间过长,我们的眼睛也越发容易疲劳,干燥.如何才能使电脑对人眼的伤害减小到最 小. 小编建议大家可以把窗口背景色设置成护眼色. ...

  5. 【SPOJ QTREE2】QTREE2 - Query on a tree II(LCA)

    You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, 2, ...

  6. Eclipse配置PyDev插件来实现python开发环境

    1.安装python解释器(完成的略过) 2.安装PyDev: 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Eclipse无法正 ...

  7. 【C++实现python字符串函数库】strip、lstrip、rstrip方法

    [C++实现python字符串函数库]strip.lstrip.rstrip方法 这三个方法用于删除字符串首尾处指定的字符,默认删除空白符(包括'\n', '\r', '\t', ' '). s.st ...

  8. 【BZOJ-3667】Rabin_Miller算法 随机化判素数

    3667: Rabin-Miller算法 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 983  Solved: 302[Submit][Status ...

  9. namespace std

    c++中使用namespace来防止命名冲突(重命名),我们经常使用的一些函数和变量都被放在一个叫std的namespace中,如标准I/O流操作,vector等等.我们在每一个文件中都可使用std中 ...

  10. 关于AWR报告命中率指标的解释(转)

    文章转自:http://blog.itpub.net/24558279/viewspace-762371/ 从Oracle 10g开始,Oracle给广大DBA提供了一个性能优化的利器,那便是Auto ...