有没有《空即是色1百度云资源》电影百度云资源?

PHP 7.0 与 PHP 5.6 下 Laravel 博客应用性能对比分析
这篇文章对我很有帮助
这篇文章对我很有帮助
学院君 has written
资深PHP工程师,Laravel学院院长
PHP 7 系列使用XHProf进行线上PHP性能追踪及分析
(window.slotbydup=window.slotbydup || []).push({
id: '2611110',
container: s,
size: '240,200',
display: 'inlay-fix'
您当前位置: &
[ 所属分类
| 时间 2016 |
作者 红领巾 ]
今天介绍下大家并不陌生的XHProf。它是Facebook开发的用来分析线性能的工具。相比较于Xdebug,占用内存和性能更低。
1.XHProf安装
# wget http://pecl.php.net/get/xhprof-0.9.4.tgz# tar zxvf xhprof-0.9.4.tgz# cd xhprof-0.9.4/extension/# phpize //结合自己的环境确认phpize的目录# ./configure --with-php-config=/usr/local/php/bin/php-config //结合自己的环境确认phpize的目录# make# make install
安装完成后,在php.ini中添加 extension=xhprof.so。
重启下web应用服务器。
2.监控配置
PHP5.5以下,PHP文件中开启的代码
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);
PHP5.5及以上,PHP文件中开启的代码
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
简单的方式网上都可以百度到,下面主要讲下更好的注入方式。使用PHP本身进行注入,这样就不用修改PHP的项目代码。
具体的注入方式为:修改php.ini的文件,加上 auto_prepend_file =
/opt/inject_xhprof.php,这样所有的php-fpm请求的php文件前都会自动注入/opt/inject_xhprof.php文件。inject_xhprof.php代码如下:
if(php_sapi_name() == 'cli'){}$xhprof_config = require "/opt/xhprof_config.php";if(!empty($xhprof_config['enabled']) && strpos($xhprof_config['allowUrl'],$_SERVER['SERVER_NAME']) !== false){xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);register_shutdown_function('shutdown');}function shutdown(){$xhprof_data = xhprof_disable();include_once "/wwwroot/tools/xhprof/xhprof_lib/utils/xhprof_lib.php";include_once "/wwwroot/tools/xhprof/xhprof_lib/utils/xhprof_runs.php";$objXhprofRun = new XHProfRuns_Default();$run_id = $objXhprofRun-&save_run($xhprof_data, "xhprof");//此处空间很大if(function_exists('fastcgi_finish_request')){fastcgi_finish_request();}}
以上的代码是基于LNMP,其中PHP5.2.17 、5.6 、Nginx1.4进行测试的。以上的方法就不用在PHP的代码中加上开始和结束的XHProf的代码了。
其中xhprof_config.php可以配置是否开启调试、哪些网站允许调试、哪些IP允许执行XHProf等操作。
此处空间很大。具体可以做的事情为: 将生产的$run_id异步存入数据库或者Redis,这样就可以方便的进行两次优化的性能对比,输入网址,直接查看当前地址的性能。
将xhprof_html拷贝到单独的目录下,配置独立的域名,这样可以更方便的管理。
XHProf追踪和分析PHP性能的确不错。但是为了不影响线上的性能,最好放在灰度环境进行测试。如果放在线上测试的话,建议做一个随机值,比如没1000次进行一次分析。
将$run_id异步存入数据库或者Redis也是为了更好地分析。
以前在只开启xhprof_enable的时候,没有关闭操作,导致页面加载很慢,具体的原因没有找到,所以大家在做判断的时候,最好xhprof_enable 和 xhprof_disable 一起判断。
本文开发(php)相关术语:php代码审计工具 php开发工程师 移动开发者大会 移动互联网开发 web开发工程师 软件开发流程 软件开发工程师
转载请注明本文标题:本站链接:
分享请点击:
1.凡CodeSecTeam转载的文章,均出自其它媒体或其他官网介绍,目的在于传递更多的信息,并不代表本站赞同其观点和其真实性负责;
2.转载的文章仅代表原创作者观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,本站对该文以及其中全部或者部分内容、文字的真实性、完整性、及时性,不作出任何保证或承若;
3.如本站转载稿涉及版权等问题,请作者及时联系本站,我们会及时处理。
登录后可拥有收藏文章、关注作者等权限...
CodeSecTeam微信公众号
当你的才华还撑不起你的野心时,那你就应该静下心来学习。当你的经济还撑不起你的梦想时,那你就应该踏实的去工作!
手机客户端西西软件园多重安全检测下载网站、值得信赖的软件下载站!
→ facebook轻量级的php性能分析工具工具xhprof的安装与使用
V1.08 绿色版
类型:服务器区大小:858KB语言:英文 评分:6.6
Facebook的真实工作环境或许没有大家想象之中的那样完美,xhprof ―― facebook 开发的一个测试php性能的扩展。跟Xdebug类似,但性能开销更低,还可以用在生产环境中,也可以由程序开 关来控制是否进行profile。下载源码包的网址&http://pecl.php.net/package/xhprof上面说了,每个版本适用的php版本。一、这是一个php扩展的形式。我们安装gd2,curl都是php的扩展形式。只不过有的时候编译的时候就安装进去了。像操作,也是一个mysql.so这样的扩展,安装了扩展,就能调用mysql_query()这些函数。要操作oracle,也有对应的oracle扩展加到php引擎中去。现在要把xhprof扩展加到php中去。很久没使用phpize安装扩展了。ps:我也在思考,这个东西怎么这么容易忘记。我只知道他的作用。但是完全不记得他的操作步骤。要注意的细节。看我得想办法以通俗的方式来理解记住它。二、php.ini需要进行配置的项[xhprof]extension=xhprof.; directory used by default implementation of the iXHProfRuns; interface (namely, the XHProfRuns_Default class) for storing; XHProf runs.;;xhprof.output_dir=&directory_for_storing_xhprof_runs&;储存 XHProf 运行数据的默认目录xhprof.output_dir=/tmp/xhprof三、有了这个扩展后,就能在自己的php代码中调用这个扩展内置的函数来做性能监控了,像下面这样子xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);................这里是要被监控的代码块$data = xhprof_disable();include_once &xhprof_lib/utils/xhprof_lib.php&; &include_once &xhprof_lib/utils/xhprof_runs.php&; &$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中&$run_id = $objXhprofRun-&save_run($data, &test&);=====================================================几个扩展函数如下步骤实施1、先找到我服务器上php的安装目录,phpize一般都是在安装目录中,如下:/usr/local/php/bin/phpize2、找出php-config在哪个目录(下面会用到),我的服务器在:/usr/local/php/bin/php-config目的:在下面进行编译的时候,会用到这个文件./configure --with-php-config=/usr/local/php/bin/php-config3、找到我服务器上php扩展在哪个目录,不确定的话,我觉得去php.ini中也能看到,如下extension_dir = &/usr/local/php/lib/php/extensions/no-debug-non-zts-/& 这个路径感觉有点长。不用去改了php.ini中的设置,目前我觉得没必要(商业与时间成本,这部分还不是制约因素)。按原来的继续放扩展。现在知道扩展目录为:/usr/local/php/lib/php/extensions/no-debug-non-zts-/也就是说,我要把xhprof的源码包解压到这个目录下去(解压后会生成一个新的文件夹)。那我就要去这个目录下运行phpize(这样方便在这个目录下面生成configure文件),phpize的特点:在a目录下运行phpize,就会在a目录下生成configure。得到上面路径,shell命令实践cd& /usr/local/php/lib/php/extensions/no-debug-non-zts-/解压下载到的xhprof压缩包(我不是通过wget下载的,我是把这个压缩直接通过ftp上传到no-debug-non-zts-目录中去)。tar zxf xhprof-0.9.3.tgz&&&&&&&&&&&&&& #解压后,里面有个extension文件夹,进入里面去(目的是进入里面去运行phpize),解压后的目录结构如下cd xhprof-0.9.3/extension/&&&&&&&&&&& #切换到这个扩展的源码目录去在这个目录下面运行phpize,就会在extension目录下生成一个configure文件(这是phpize的机制)/usr/local/php/bin/phpize&&去看一下扩展目录,会发现在extension目录生成了一个configure文件。运行它======================================./configure --with-php-config=/usr/local/php/bin/php-config #用到了前面找到的php-config文件。make && make installmake test======================================运行成功后,会提示生成的xhprof.so文件在哪个位置,提示信息:Libraries have been installed in:&& /usr/local/php/lib/php/extensions/no-debug-non-zts-/xhprof-0.9.3/extension/modules这个目录下已经存在一个文件:/usr/local/php/lib/php/extensions/no-debug-non-zts-/xhprof.so刚才生成了xhprof.so这个模块文件,现在要在php.ini中加载刚才生成xhprof.so模块才能生效:[xhprof]extension=xhprof.; directory used by default implementation of the iXHProfRuns; interface (namely, the XHProfRuns_Default class) for storing; XHProf runs.;;xhprof.output_dir=&directory_for_storing_xhprof_runs&xhprof.output_dir=/tmp/xhprof平滑重新加载php.ini文件:/usr/local/php/sbin/php-fpm reload提示:Reload service php-fpm& done说明成功。现在去phpinfo中看xhprof扩展是否加载成功了安装作图工具(选填,可以后续再安装)yum install -y graphviz================================================工具的使用实践================================================index.php中的代码:&?phperror_reporting(-1);xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY);&$begin_time = microtime_float();///////////////统计执行速度代码$end_time = microtime_float();$exec_time& = $end_time-$begin_//@save_stat($exec_time);for($i=0;$i&10;$i++){for($j=0;$j&10;$j++){}}$data = xhprof_disable();include_once &xhprof_lib/utils/xhprof_lib.php&;//从源码包中拷贝xhprof_lib这个文件夹过来直接可以调用include_once &xhprof_lib/utils/xhprof_runs.php&; &$objXhprofRun = new XHProfRuns_Default();//数据会保存在php.ini中xhprof.output_dir设置的目录去中&$run_id = $objXhprofRun-&save_run($data, &test&);//第二个参数是定义文件名称。名称如果为&xhprof&,则在xhprof.output_dir设置的目录生成的文件:522ab85f40229.xhprof.xhprof。//格式为:&id标识.名称.xhprof&,id标识就是$run_id得到的结果。var_dump($run_id);echo &/xhprof_html/index.php?run={$run_id}&source=test\n&;//source的值必须是save_run中指定的名称。这个其实就是根据编号和名称才能定位到对应的文件&522ab85f40229.xhprof.xhprof&//将这个地址输出来,是为了直接可以去查看分析结果。function save_stat($time){&& &static $call_count=1;&& &$call_limit = 10;&& &if(!$time)&&&&&&& $date = date(&Y-m-d&);//暂时按照天来生成文件。方便查阅&& &$exec_stat_file = './exec_stat'.DIRECTORY_SEPARATOR.&exec_stat_file-&.$date.&.txt&;&& &$fp = fopen($exec_stat_file,'ab');&& &if(flock($fp,LOCK_EX))&& &{&& &&& &$s = 'access:'.date(&Y-m-d H:i:s&).',execute time:'.$time.'s,request_url:http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].&||&.PHP_EOL;&& &&&& fwrite($fp,$s);&& &&&& flock($fp,LOCK_UN);&& &}else{&& &&& &usleep(1000);&& &&& &if($call_count&$call_limit)&& &&& &{&& &&& &&& &$call_count++;&& &&& &&&& save_stat($time);&& &&& &}&& &}&& &@fcolse($fp);&& &//var_dump($fp);}function microtime_float(){&&& list($usec, $sec) = explode(& &, microtime());&&& return ((float)$usec + (float)$sec);}?&加粗的黑体,就是分析用到的代码。其中用到了源码包中的xhprof_lib中的代码,代码中&XHProfRuns_Default&这个类就是里面的。生成了分析结果后,现在可以去使用源码包中提供的web版的工具查看了。xhprof_html这个文件夹随便放到哪里,只要放到能够通过web访问的目录下即可,不过这个里面会用到xhprof_lib中的类,所以还是一起复制过去,跟源码包中保持一样的结构才好。xhprof_html与xhprof_lib要保持平行我这里,这个工具的访问方式是:/xhprof_html/index.php?run=xxx&source=xxx\nsource的值必须是save_run中指定的名称。这个其实就是根据编号和名称才能定位到对应的文件&522ab85f40229.xhprof.xhprof&访问看到的结果如下图中,红色的表示最耗费性能的,黄色的其次。只了解这么多了。具体的分析结果怎么看,在文件夹xhprof_html中有个docs目录,里面是说明文档。说了一些专用术语的定义
05-2807-1103-1701-2301-2201-2101-1701-1401-1301-12
阅读本文后您有什么感想? 已有23人给出评价!
名称大小下载PHP性能分析工具&xhprof
下载地址:&
cd /data/soft
wget http://pecl.php.net/get/xhprof-0.9.4.tgz
tar -zxf xhprof-0.9.4.tgz
cd xhprof-0.9.4
cd extension/
./configure --with-php-config=/usr/local/php/bin/php-config
#上面的路径是自己本机PHP的配置文件路径
make && make install
#此处完成后会显示出 xhprof.so 所在的路径,将该文件复制到PHP扩展的目录
cp /data/soft/xhprof-0.9.4/extension/modules/xhprof.so /usr/local/php/lib/php/extensions/no-debug-non-zts-/
这里的目标地址是 php.ini 中 extension_dir 的值。如果 php.ini 中没有 extension_dir 这一项,自己添加到并配置一个目录,然后将 .so 文件复制到其中。
建立分析结果导出目录:
mkdir -p /data/xhprof/xhprof_data在 php.ini 中添加如下行:
xhprof.output_dir = /data/xhprof/xhprof_data
extension = xhprof.so
mkdir -p /usr/local/php/include/xhprof/
在 php-fpm.conf 中添加:
env[XHPROF_ROOT_PATH] = /usr/local/php/include/xhprof/
#后面在PHP代码中可以通过 $_SERVER['XHPROF_ROOT_PATH'] 来引用,比较方便。
将 xhprof 解压目录下的 xhprof_lib 复制到上面目录中.此步目的是以后在程序中引用里面的类库时更方便,如果不执行该步也可以。
cp -r /data/soft/xhprof-0.9.4/xhprof_lib/ /usr/local/php/include/xhprof/xhprof_lib
yum install -y graphviz
#安装图形绘制工具,后面的结果可以通过该工具以图形显示,更直观
查看安装结果
重新加载 php 配置文件
service php-fpm reload
在 WEB 页面上查看 phpinfo 或者在命令行中执行:
php -i | grep xhprof
xhprof =& 0.9.2
分析结果查看配置
cp -r /data/soft/xhprof-0.9.4/xhprof_html/ /home/wwwroot/default/xhprof_html
#将 xhprof 自带的结果查看页面复制到本机器的WEB目录下
cp -r /data/soft/xhprof-0.9.4/xhprof_lib/ /home/wwwroot/default/xhprof_lib
#由于显示结果也用到了 xhprof_lib 里的类库,且里面的代码是按相对路径引用的,所以先直接把该库和页面放在一起
在 PHP 页面顶部加上:
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS + XHPROF_FLAGS_MEMORY);
在页面底部加上:
$xhprof_data = xhprof_disable();
include_once $_SERVER['XHPROF_ROOT_PATH'] . "/xhprof_lib/utils/xhprof_lib.php";
include_once $_SERVER['XHPROF_ROOT_PATH'] . "/xhprof_lib/utils/xhprof_runs.php";
$xhprof_runs = new XHProfRuns_Default();
//数据会保存在php.ini中xhprof.output_dir设置的目录去中
$run_id = $xhprof_runs-&save_run($xhprof_data, str_replace(".", "_", basename(__FILE__)));
//第二个参数是定义文件名称
访问上面的页面后,在结果目录发现有如下文件产生:
ls -l /data/xhprof/xhprof_data/
-rw-r--r-- 1 www www 16080 12月
4 21:24 548060a27725b.co_main_php.xhprof
-rw-r--r-- 1 www www 16076 12月
4 21:24 548060a2c49f7.co_main_php.xhprof
请求页面:&
页面结果:
No XHProf runs specified in the URL.&
Existing runs:&
c49f7.co_main_php.xhprof
25b.co_main_php.xhprof
即上面显示的生成的结果文件。&
点击一个文件查看详细结果,得到:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。PHP性能监控测试---XHProf介绍
来源:open开发经验库
Xhprof----facebook开源的,轻量级的PHP性能分析工具: 包括函数的调用次数,花费的时间(自身花费时间和包含内部函数花费的时间),所占内存/CPU,所占内存的峰值及所占百分比
这个真的是灰常的好用可以非常快的知道性能瓶颈在哪个文件的哪个函数,然后针对性的做优化:给个截图具体说明
这是业务管理的部分,从路线图中黄色和红的检测的过程中发现,这个函数竟然掉了99次数据库,查看源代码,竟然有连表查询,然后查询放到了foreach中,导致了很多次小的查询。接下来就剩下针对性的优化了。
XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情 况。一个函数的开销,可细分成调用者和被调用者的开销。原始数据收集部分是用纯C实现的,是一个名叫xhprof的 Zend扩展 。XHProf有一个简单的HTML的用户界面( PHP写成的)。基于浏览器的性能分析用户界面能更容易查看,或是与同行们分享成果。也能绘制调用关系图。
XHProf报告往往可以有助于理解被执行的代码的结构。的等级性质的报告可用来确定,例如,什么链要求导致了所谓的特殊 功能得到。
XHProf可以比较两次运行的结果(又名“差异报告”)或是从多次运行得到的汇总数据。差异和汇总报告,就像单一运行报 告一样,也提供“平板”以及“分层”的性能分析视图。
XHProf 是一种轻量级的性能分析工具。在数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态 callgraph的一个程序。它独有的数据计算的报告/后处理阶段。在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用 中每个深度的调用一个有用的命名来避开死循环。
XHProf的轻量级性质和汇聚功能,使得它非常适合用于收集“生产环境”的性能统计数据的统计。[见用于生产环境的补充 说明。 ]
例如,XHProfLive (不属于开源的工具包),是Facebook使用的一个全系统的性能监测系统,建立在XHProf的基础之上 。 XHProfLive不断收集函数级别的Profiler资料,这些资料来自生产环境中运行中的示例页面[用xhprof来收集] 。然后XHProfLive汇总指定的时候,页面类型,来取得各个页面的性能数据,可以帮助解决各种问题,如:特定的某个网页的函数级的性能情况怎样?在 所有网页中,或者对某一具体的网页,foo 函数的开销如何?在过去的一小时/天/周中,哪些函数返回的次数最多?某个页面/函数的执行时间的变化趋势如何?等等。
由Facebook最初开发的XHProf在2009年3月开放源代码。
XHProf概况
XHProf提供的功能:
load::lib/common.php - 内核加载和编译文件的工作。[注:如果您使用的了PHP的opcode 缓存比如APC之类的,只有当缓存失效时才会去编译。
run_init::lib/common.php -由于包含操作引起的初始化操作等。
哪些函数调用了指定的函数,各自调了多少次?
一个特定的函数调用了哪些函数?
在被一个特定的函数调用时,某个函数一共耗去了多少时间 。
扁平的性能概要( )
提供函数级别的性能信息,例如调用次数,其中包括/独家壁时间,内存使用情况,和CPU时间。
分层剖析(父/子{0视图){/0} (
对每一个函数,它提供了一个断点,个崩溃的要求和时间每母公司(来电)和儿童(被调用) ,如:
差异报告
出于各种原因,您可能需要比较从两个XHProf运行中得到的数据-找出是什么造成了从一个版本到另一个版本的退 步,或是评估您将要做的优化的性能提升。
阿差异报告考虑两分,作为输入,并提供两个平面功能级别差异的信息,和层次信息(细目差异的父母/儿童职能)的每 个功能。
差异报告里的“平板”视图指出了最主要的退步或改进。
点击差异报告平板视图中的函数,进入“层次”(或父/子)视图。我们可以得到的具体的父子函数的差异。
Callgraph视图
性能数据也可以通过callgraph视图来查看 。callgraph 会高亮显示程序的关键路径。
内存剖析
XHProf的内存剖析模式能有助于跟踪那些申请大量内存的函数。
值得澄清的是,XHProfu并不严格跟踪所有分配/释放内存的操作。相反,它使用了一种简化思路。他记录了每个 函数进入和结束后的内存的增减。它还记录每个函数分配内存的峰值的变化。
XHProf记录include, include_once, require and require_once require_once操作,就像他们是函数一样。那些被包含文件的名字被用来产生假的函数的名字。
术语表
特殊函数的命名约定
真正的层次剖析器会在每一个数据采集点记录完全的调用堆栈。接下来,能够回答这些问题,如:第三次foo()调用 的开销是多少?或是当调用栈是a()-&b()-&bar()时bar()函数的开销是多少?
XHProf只记录一级的调用上下文,因此只能回答关于一级一级函数调用的问题。事实证明,在实践中这是最主要的 利用情况。
为了使这个更具体,看看下面的例子。
假设你有:
1 call from a() --& c()
1 call from b() --& c()
50 calls from c() --& d() 虽然XHProf可以告诉你, d()被c()调用了50次,却不能告诉你,有多少次分别是由a()和b()引起的。[我们可以推测,也许有25次是因为a(),有25次是由于b(), 但未必如此。 ]
然而在实践中,这没什么大不了。
main():一个虚构的函数,这是所有调用的根节点。
load::&filename& 和 run_init::&filename&:
XHProf 跟踪PHP的include/require操作,和跟踪函数调用一样。
例如, include “lib/common.php"; 操作看起来像调了两个XHProf函数:
foo@&n& :意味着这是一个foo()函数的递归调用。&n&代表递归深度。递归可能是直接的,(比如由于foo() --& foo() ) ,也可能是间接的(如由于foo()-& goo() -&foo()。
Inclusive Time (或子树执行时间) :[包括子树执行时间的所有执行时间。]
Exclusive Time/Self Time :[函数执行本身的时间花费。]不包括子树执行时间。
Wall时间 :又名经过的时间或挂钟时间。
CPU时间 : CPU时间在用户空间+ CPU时间在内核空间
安装XHProf扩展
这个扩展在"extension"子目录里。
注:Windows的版本还没有实现。目前我们已经在Linux/FreeBSD 上测试了xhprof。
0.9.2及以上版本的XHProf也正计划着移植到Mac OS下。[我们在Mac OS 10.5下测试过。]
注: XHProf使用RDTSC指令(时间戳计数器)来实现一个真正的低资源消耗的计数器[针对elapsed time]。因此目前xhprof还 只适用于x86架构。此外,因为RDTSC的数据不能在CPU间同步,在剖析时xhprof会将程序绑定在单个 的CPU。
如果SpeedStep技术是打开的,XHProf的基于RDTSC定时器的功能就不能正 常工作了。这项技术在某些英特尔处理器上是可用的。[注:苹果台式机和笔记本电脑一般都将SpeedStep技术预设开启。使用XHProf,您需要禁用 SpeedStep技术。 ]
下面的步骤,应该在Linux / Unix环境下进行。
% cd &xhprof_source_directory&/extension/
% phpize
% ./configure --with-php-config=&path to php-config &
% make
% make install
% make test php.ini文件 :您可以更新您的php.ini文件来自动加载您的扩展。将以下内容添加到你的php.ini文件。
[xhprof]
extension=xhprof.so
; directory used by default implementation of the iXHProfRuns
; interface (namely, the XHProfRuns_Default class) for storing
; XHProf runs.
xhprof.output_dir=&directory_for_storing_xhprof_runs &
使用XHProf来做性能分析
用下面的示例程序来试着产生一些原始的性能数据:
foo.php
&?php
function bar($x) {
if ($x & 0) {
bar($x - 1);
function foo() {
for ($idx = 0; $idx & 2; $idx++ ) {
bar($idx);
$x = strlen("abc");
// start profiling
// run program
foo();
// stop profiler
// display raw xhprof data for the profiler run
print_r($xhprof_data); 运行上面的测试程序:
% php -dextension=xhprof.so foo.php 你应该得到的输出如下:
Array
[foo==&bar] =& Array
# 2 calls to bar() from foo()
[wt] =& 27
# inclusive time in bar() when called from foo()
[foo==&strlen] =& Array
[ct] =& 2
[wt] =& 2
[bar==&bar@1] =& Array
# a recursive call to bar()
[ct] =& 1
[wt] =& 2
[main()==&foo] =& Array
[ct] =& 1
[wt] =& 74
[main()==&xhprof_disable] =& Array
[ct] =& 1
[wt] =& 0
[main()] =& Array
# fake symbol representing root
[ct] =& 1
[wt] =& 83
) 注:The raw data only contains "inclusive" metrics. For example, the wall time metric in the raw data represents inclusive time in microsecs. Exclusive times for any function are computed during the analysis/reporting phase.
注意:默认情况下只有调用次数和占用时间是记录了的。您也可以选择同时记录CPU 时间和/或单纯记录内存使用量。将下面这一行:
xhprof_enable(); 换成:
xhprof_enable(XHPROF_FLAGS_CPU + XHPROF_FLAGS_MEMORY); ; 您应该得到如下的输出:
Array
[foo==&bar] =& Array
# number of calls to bar() from foo()
[wt] =& 37
# time in bar() when called from foo()
[cpu] =& 0
# cpu time in bar() when called from foo()
[mu] =& 2208
# change in PHP memory usage in bar() when called from foo()
[pmu] =& 0
# change in PHP peak memory usage in bar() when called from foo()
[foo==&strlen] =& Array
[ct] =& 2
[wt] =& 3
[cpu] =& 0
[mu] =& 624
[pmu] =& 0
[bar==&bar@1] =& Array
[ct] =& 1
[wt] =& 2
[cpu] =& 0
[mu] =& 856
[pmu] =& 0
[main()==&foo] =& Array
[ct] =& 1
[wt] =& 104
[cpu] =& 0
[mu] =& 4168
[pmu] =& 0
[main()==&xhprof_disable] =& Array
[ct] =& 1
[wt] =& 1
[cpu] =& 0
[mu] =& 344
[pmu] =& 0
[main()] =& Array
[ct] =& 1
[wt] =& 139
[cpu] =& 0
[mu] =& 5936
[pmu] =& 0
) 在分析时跳过内置函数
默认情况下, PHP的内置函数(如strlen )也被分析了。如果您不希望分析内置函数(为了进一步减少性能分析的开销貌相或减小产生的原始数据) ,您可以使用XHPROF_FLAGS_NO_BUILTINS标 志,例如:
// do not profile builtin functionsxhprof_enable ( XHPROF_FLAGS_NO_BUILTINS ) ; 在性能分析时忽略特定函数( 0.9.2或更高版本支持)
从 0.9.2版本的xhprof ,你可以告诉XHProf在性能分析时忽略一些指定函数。这样,您就可以忽略,像功能用于间接函数调用,如call_user_func和 call_user_func_array的 函数 。这些不必要的中间层,因为他们乱七八糟的父-子关系和间接的互相调用,使XHProf报告难以理解。
要设定要忽略的函数列表,可以在分析时给xhprof_enable函 数 指定第二个参数[是个可选参数] 。例如,
// el ignore call_user_func* during profiling
xhprof_enable(0,
array('ignored_functions' =&
array('call_user_func',
'call_user_func_array')));
// elapsed time + ignore call_user_func* during profiling
xhprof_enable(XHPROF_FLAGS_MEMORY,
array('ignored_functions' =& array('call_user_func',
'call_user_func_array')));
设置XHProf用户界面
index.php :查看一个单一运行或差异报告。
callgraph.php :以图片的形式查看一次XHProf运行的调用关系图。
typeahead.php :在XHProf的报告中被后台调用来进行函数的自动补全。
PHP源码目录结构
XHProf的用户界面的由PHP实现。代码存放在两个子目录中: xhprof_html/和xhprof_lib/ 。
xhprof_html目录包含了3个顶级PHP页面。
该xhprof_lib目录包含进行分析和显示的支持代码 (计算 扁平的性能信息,计算diffs,从多次运行中汇总数据等等) 。
Web服务器配置:您需要确保您的Web服务器有权限读取xhprof_html/目 录可,并且能运行PHP脚本。
管理XHProf运行
客户端能很灵活地保存他们从XHProf运行中得到的 XHProf原始数据。用户界面层 的XHProf提供了一个 iXHProfRuns接口(见xhprof_lib / utils / xhprof_runs.php ),客户端可以利用。这使得客户端能够告诉用户界面层,如何获取XHProf运行后产生的对应数据。
XHProf的UI 库自带的有一个基于文件的iXHProfRUns接口实现,即“ XHProfRuns_Default”(见xhprof_lib/utils/xhprof_runs.php)。这个自带的实现将XHProf运行结 果存在ini配置的参 数指定的某个目录下。
一次XHProf运行,必须用一个命名空间和运行编号来唯一确定。
一)XHProf数据的永久保存 :
假设您使用的iXHProfRuns接口的XHProfRuns_Default这 个默认实现方式,一个典型的XHProf运行并保存结果的操作可能就是这样子的:
// start profiling
xhprof_enable();
// run program
// stop profiler
$xhprof_data = xhprof_disable();
// Saving the XHProf run
// using the default implementation of iXHProfRuns.
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();
// Save the run under a namespace "xhprof_foo".
// **NOTE**:
// By default save_run() will automatically generate a unique
// run id for you. [You can override that behavior by passing
// a run id (optional arg) to the save_run() method instead.]
$run_id = $xhprof_runs-&save_run($xhprof_data, "xhprof_foo");
echo "---------------\n".
"Assuming you have set up the http based UI for \n".
"XHProf at some address, you can view run at \n".
"http://&xhprof-ui-address &/index.php?run=$run_id&source=xhprof_foo\n".
"---------------\n"; 上述代码就会将运行结果保存在xhprof.output_dir ini参数指定的特定目录下。文件的名称可能会是49bafaa3a3f66.xhprof_foo类似的东 东 ;两部分分别是运行编号( “ 49bafaa3a3f66 ” )和命名空间( “ xhprof_foo ” )。[如果您想创建/指定自己的run ID (如数据库中的序列号,或时间戳) ,您可以通过明确的给save_run方法 指定一个run id。
b )使用自己实现的iXHProfRuns
如果您希望您的XHProf运行存储在不同的数据库(例如用一个压缩格式,或者其他什么地方比如数据库等),您需实现一个类,这个实必须实现 iXHProfRuns ( )接口。
您还需要修改“xhprof_html/"目录中3个主要的PHP入口文件 (index.php , callgraph.php , typeahead.php ),使用新的类而不是默认的类XHProfRuns_Default 。改变3个文件的这一行:
$xhprof_runs_impl = new XHProfRuns_Default(); 您还需要“include”声明了上述class的文件。
从用户界面中访问各次运行
一)看单一运行报告
要查看run id是&run_id&和命名空间是&namespace&的报告,访问URL:
http://&xhprof-ui-address&/index.php?run=&run_id&&source=&namespace&
例如,
http://&xhprof-ui-address&/index.php?run=49bafaa3a3f66&source=xhprof_foo
二)查看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的注意 事 项
这里给出一些意见和准则。您的情况可能会有所不同:
CPU的计时器( getrusage )在Linux上开销很大。为了在函数级别更有用,这个是粗粒度的(毫秒精确度,而不是微秒水平)。因此,使用XHPROF_FLAGS_CPU模式时, 在报告里,数字上的误差往往会更高。
我们建议在生产环境中使用 "占用时间+内存" 来做性能分析。[注:内存性能分析模式的额外开销很低。 ]
// elapsed time profiling (default) + memory profiling
xhprof_enable(XHPROF_FLAGS_MEMORY);
对随机抽样的部分page/request来做性能分析,对于获取您的生产环境的负载 情况特征数据,其实足够好了了。
分析万分之一的请求,可以用下面的代码:
if (mt_rand(1, 10000) == 1) {
xhprof_enable(XHPROF_FLAGS_MEMORY);
$xhprof_on =
} request结束时(或是在退出函数中) ,您可以这么做:
if ($xhprof_on) {
// stop profiler
$xhprof_data = xhprof_disable();
// save $xhprof_data somewhere (say a central DB)
} 然后,您就可以用xhprof_aggregate_runs()来按时间(比如,每5 分钟/每小时/每天),或是按页面类型/request类型来汇总。
轻量级采样模式
Xhprof扩展还提供了一个轻量级采样模式 。采样间隔为0.1秒。采样记录了整个函数调用堆栈。如果想以增加极低的负载作代价来进行性能监控和诊断,采样模式就是你想要的。
XHProf扩展提供的与采样模式相关的函数有xhprof_sample_enable()和xhprof_sample_disable() 。
[ 待定 :关于采样模式更详细的文档。 ]
附加功能
xhprof_lib/utils/xhprof_lib.php文 件包含额外的库函数,可用于维护/汇总XHProf运行结果。
例如:
xhprof_aggregate_runs() :可用于多次XHProf运行结果汇总到一个单一的运行。这可以帮助您使用XHProf来建立一个全系统“的函数级别”的性能监测工具 。 [例如,您可以在生产环境中定期抽样XHProf的数据,产生小时/日级别的报告。 ]
xhprof_prune_run() :汇总大量XHProf运行结果(特别是如果它们对应不同类型的程序)将可能导致callgraph规模变得太大。您可以使用xhprof_prune_run功 能来修剪的callgraph数据中只占总运行时间中很小比例的子树。
依赖性
JQuery的Javascript :在提示和函数名称补齐上 ,我们利用了JQuery这个JavaScript库。JQuery是基于MIT和GPL licencse ( /Licensing ) 的。XHProf用到的JQuery相关代码,在xhprof_html/jquery子 目录。
dot(图像生成工具) :调用关系视图工具( [查看Callgraph ] )这个功能依靠dot工具实现。 “点”是一种绘制/生成有向图的工具。
查询分析结果的HTML用户界面受到了Oracle 的存储过程语言PL/SQL里的一个相似的小工具的启发。但是仅仅如此,他们的内部性能分析过程是完全不同的。
免责声明:本站部分内容、图片、文字、视频等来自于互联网,仅供大家学习与交流。相关内容如涉嫌侵犯您的知识产权或其他合法权益,请向本站发送有效通知,我们会及时处理。反馈邮箱&&&&。
学生服务号
在线咨询,奖学金返现,名师点评,等你来互动

我要回帖

更多关于 空即是色2015百度云 的文章

 

随机推荐