当前位置:网站首页>php microtime 封装工具类,计算接口运行时间(打断点)
php microtime 封装工具类,计算接口运行时间(打断点)
2022-08-03 12:04:00 【倾听岁月】
引言
当我们开发完自己负责板块的相关业务程序,然后发布到线上后出了问题。然后做问题排查的时候,发现是接口运行超时的问题。所以我们需要通过某个途径去知晓这个接口每个工作环节的执行时间。本文根据我的想法和经验,设计了一个工具类,通过这个工具类,我们可以知晓各个工作环节的运行时间。
php本身有提供一个函数microtime,通过这个函数并配合我们打断点。我们就能知道程序运行时各个地方的耗时。
样例
本样例适用于php-fpm模式或cli模式,如果你采用的swoole-work 请考虑脏数据的问题(swoole-work 常驻内存,多个线程共享内存)
封装microtime,设计一个断点类
Point.php
<?php
namespace App\Components\Util;
class Point
{
//初始时间
public float $startTime;
//StdClass 是 php当中的空类,但不是所有类的基类,相关内容请自行百度
public \StdClass $runTimes;
public function __construct()
{
//初始化当前时间
$this->startTime = microtime(true);
//初始化一个空类
$this->runTimes = new \StdClass;
}
public function addPoint(string $pointName)
{
//统计断点时间
$this->runTimes->{$pointName} = microtime(true);
}
//断点时间计算
public function calculation()
{
//初始化一个空类来统计
$data = new \StdClass;
//断点时间计算
if(!empty($this->runTimes))
{
foreach((array)$this->runTimes as $k=>$v)
{
$data->{$k} = number_format(bcsub($v , $this->startTime,4) * 1000,4) . "毫秒";
}
}
return $data;
}
}
关于断点类的使用
public function index14()
{
$runTime = new Point();
/**
* @var Test3 $test3
*/
$test3 = app()->make(Test3::class);
//断点-1
$runTime->addPoint("test3_run");
$userinfo = $test3->userService->get(867076808);
//断点-2
$runTime->addPoint("user_service_get");
$this->info($userinfo->username);
//断点-3
$runTime->addPoint("print");
//打印断点执行时间
dd($runTime->calculation());
}
输出结果
wsyUMcKjfP
{
+"test3_run": "9.8000毫秒"
+"user_service_get": "27.5000毫秒"
+"print": "27.9000毫秒"
}
一般我们常用于将这个辅助类去检测
restFule接口的耗时
某个类方法的执行耗时
mysql连接耗时
mysql CURD操作耗时
redis连接耗时
redis查询耗时
读写文件耗时
业务程序执行耗时
根据程序的执行情况,我们就知晓各个工作单元的执行时间,然后设计优化方案。
如果你觉得不错,给个关注和好评吧~
边栏推荐
猜你喜欢
[论文阅读] (23)恶意代码作者溯源(去匿名化)经典论文阅读:二进制和源代码对比
html+css+php+mysql实现注册+登录+修改密码(附完整代码)
【云原生 · Kubernetes】部署Kubernetes集群
mysql advanced (twenty-four) method summary of defense against SQL injection
一次内存泄露排查小结
性能优化|从ping延时看CPU电源管理
深入理解MySQL事务MVCC的核心概念以及底层原理
Explain the virtual machine in detail!JD.com produced HotSpot VM source code analysis notes (with complete source code)
第四周学习 HybridSN,MobileNet V1,V2,V3,SENet
第四课 标识符、关键字、变量、变量的分类和作用域、常量
随机推荐
87.(cesium之家)cesium热力图(贴地形)
一文带你弄懂 CDN 技术的原理
Simple implementation of a high-performance clone of Redis using .NET (1)
Vs 快捷键---探索不一样的编程
【云原生 · Kubernetes】部署Kubernetes集群
从零开始Blazor Server(6)--基于策略的权限验证
当前页面的脚本发生错误如何解决_电脑出现当前页面脚本错误怎么办
899. 有序队列
awk入门教程
"Digital Economy Panorama White Paper" Financial Digital User Chapter released!
基于Sikuli GUI图像识别框架的PC客户端自动化测试实践
【一起学Rust 基础篇】Rust基础——变量和数据类型
【MySQL功法】第5话 · SQL单表查询
thymeleaf中的日期格式转化
【MySQL功法】第2话 · 数据库与数据表的基本操作
-找树根2-
我在母胎SOLO20年
mysql advanced (twenty-four) method summary of defense against SQL injection
码率vs.分辨率,哪一个更重要?
viewstub 的详细用法_pageinfo用法