前言
性能分析是衡量应用程序在代码级别的相对性能。性能分析将捕捉的事件包括:CPU的使用,内存的使用,函数的调用时长和次数,以及调用图。性能分析的行为也会影响应用性能。
在 PHP 世界里,有两个截然不同的的性能分析器——主动和被动。
主动 VS 被动性能分析
主动分析器在开发过程中使用,由开发人员启用。主动分析器收集的信息比被动分析器多,对性能的影响更大。通常,主动分析器不能用在生产环境中。XDebug 就是一种主动分析器。
因为无法在生产环境中使用主动分析器,Facebook 推出了一个被动分析器——XHProf。XHProf 是为了在生产环境中使用而打造的。它对性能的影响最小,同时收集足够的信息用于诊断性能问题。
XDebug适用于开发环境,XHprof更适用于生产环境。
安装
下载地址:http://pecl.php.net/package/xhprof
1.wget http://pecl.php.net/get/xhprof-2.2.0.tgz
2.tar -zvxf xhprof--2.2.0.tgz
3.cd xhprof--2.2.0
4.cd extension/
5.开始安装php扩展 phpize
6../configure --with-php-config=/usr/local/php/bin/php-config (这里php-config的路径以你的配置为准,不知道的可以php -i查看下)
7.make && make install
8.修改php.ini文件
加入配置
[xhprof] extension=xhprof.so xhprof.output_dir=/www/wwwroot/yourwebpath/public/xhprof
xhprof.output_dir指定概要分析文件的存放路径。
9.重启php-fpm使用php -m 查看已加载扩展
安装成功!
配置分析结果网站
1.新建一个站点 设置一个可用的端口
2.将解压出来的安装包中的xhprof_html和xhprof_lib文件夹拷贝到站点根目录
访问可以使用ip:端口/xhprof_html/index.php 检查是否配置成功
项目集成
以thinkphp5为例
1.在application/config.php中指定xhprof的相关配置信息,以便更方便的动态管理xhprof
'xhprof'=>[ 'enable'=>true, 'name'=>'mysite',//多项目用 'code'=>'mycode', 'domain'=>'' //分析结果展示域名 需要家端口号,前面配置过的 ]
2.在application/tags.php配置行为扩展文件
'app_init' => [ 'app\\common\\behavior\\XhprofEnable', ], 'app_end' => [ 'app\\common\\behavior\\XhprofDisable', ],
3.application/commo/behavior/XhprofEnable.php
php namespace app\common\behavior; class XhprofEnable { public function run(&$params) { if(config('xhprof.enable') && input('code') == config('xhprof.code') && input('DEBUG_PROFILE') && extension_loaded('xhprof') ) { require_once EXTEND_PATH.'xhprof_lib/utils/xhprof_lib.php';//这里需要注意的是将xhprof_lib文件夹拷贝到网站的能访问到的目录,我这里是放在了项目的extend目录下 require_once EXTEND_PATH.'xhprof_lib/utils/xhprof_runs.php'; xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY); } } }
4.application/commo/behavior/XhprofDisable.php
php namespace app\common\behavior; class XhprofDisable { public function run(&$params) { if(config('xhprof.enable') && input('code') == config('xhprof.code') && input('DEBUG_PROFILE') && extension_loaded('xhprof') ) { $ns = config('xhprof.name') ?: 'myxhprof'; $xhprofData = xhprof_disable(); $xhprofRuns = new \XHProfRuns_Default(); $runId = $xhprofRuns->save_run($xhprofData, $ns); $url = config('xhprof.domain').'/xhprof_html/index.php'; $url .= '?run=%s&source=%s'; $url = sprintf($url, $runId, $ns); echo '$url.'" target="_blank">查看分析结果'; exit; } } }
至此全部配置完毕
在浏览器中输入需要分析的地址加上&DEBUG_PROFILE=1&code=config中配置的code码
点击查看如果是按照我这样配置可能会出现404,临时解决办法去掉链接中的域名只保留ip部分
点击view full Callgraph可查看详细的调用图,很直观
你可能又报错了
说先你得在服务器上安装graphviz
//红帽系列 yum install graphviz //Ununtu apt-get install graphviz //OS X brew install graphviz
然后修改php.ini文件 disable_functions中把proc_open去掉,重启php-fpm,再打开浏览器,大功告成
最后,在分析带有smarty模板缓存的页面时可能用不了,这玩意应该适用于api接口性能的分析
参考文档:
PHP性能分析介绍:XHprof&XHGui,http://blog.oneapm.com/apm-tech/235.html
XHprof安装和使用,http://www.lanecn.com/article/main/aid-58
XHprof报告字段含义,https://blog.csdn.net/wide288/article/details/50427438
XHprof报告性能图报错,https://blog.csdn.net/jo_andy/article/details/78526487