Thinkphp5.1 使用Xhprof分析性能实践
上一篇文章《xhprof安装与使用 【window php7.3】》 ,详细讲解了如何安装与使用xhprof,这一篇将学习将xhprof整合到已有的项目中去,这里以Thinkphp5.1框架为例。
配置性能分析的行为
在application/tags.php文件中,定义性能分析的行为,分别绑定在app_init 应用初始化、app_end应用结束的钩子上:
文件:application/tags.php
<?php
// 应用行为扩展定义文件
return [
// 应用初始化
'app_init' => [
'app\\common\\behavior\\XhprofEnable',
],
// 应用开始
'app_begin' => [],
// 模块初始化
'module_init' => [],
// 操作开始执行
'action_begin' => [],
// 视图内容过滤
'view_filter' => [],
// 日志写入
'log_write' => [],
// 应用结束
'app_end' => [
'app\\common\\behavior\\XhprofDisable',
],
];
创建性能分析开始行为:
文件:application/common/behavior/XhprofEnable.php
<?php
namespace app\common\behavior;
use think\facade\Env;
class XhprofEnable
{
public function run() {
//控制是否开启分析(生成环境也可以做概率性捕获分析)
if(config('xhprof')['enable'] && input('DEBUG_PROFILE') && extension_loaded('xhprof')
) {
//这里需要注意的是将xhprof_lib文件夹拷贝到网站的能访问到的目录,我这里是放在了项目的extend目录下
require_once Env::get('root_path') . 'extend/'.'xhprof_lib/utils/xhprof_lib.php';
require_once Env::get('root_path') . 'extend/'.'xhprof_lib/utils/xhprof_runs.php';
xhprof_enable(XHPROF_FLAGS_NO_BUILTINS | XHPROF_FLAGS_CPU | XHPROF_FLAGS_MEMORY);
}
}
}
创建性能分析结束行为:
文件:application/common/behavior/XhprofDisable.php
<?php
namespace app\common\behavior;
class XhprofDisable
{
public function run() {
if(config('xhprof')['enable'] && 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 '<a href="'.$url.'" target="_blank">查看分析结果</a>';
exit;
}
}
}
配置参数控制化
在配置文件config/app.php中添加控制配置参数
'xhprof'=>[
'enable'=>true, //开启分析
'name'=>'mysite',//多项目用
'domain'=>'http://www.testpf.com' //性能分析结果展示的域名,前面配置过的站点
]
xhprof_lib文件引入
将下载好demo代码内的 xhprof_lib文件夹拷贝到项目的extend目录下
执行需要被分析的接口
正常运行我们的接口:加参数DEBUG_PROFILE=1
www.tp51.com/index/index…
文件:application/index/controller/Index.php
<?php
namespace app\index\controller;
use think\Controller;
class Index extends Controller
{
public function wswtest(){
return $this->handleData();
}
public function handleData(){
sleep(5);
$this->haha();
return 'ss';
}
public function haha(){
sleep(2);
return 'ss';
}
}
运行结果:
查看性能分析报告
直接点击查看分析结果,或者直接访问自己已经部署好的分析项目。查看性能报告
查看性能报告
点击 [View Full Callgraph] 查看调用链
若有收获,就点个赞吧