当前位置:网站首页>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查询耗时
读写文件耗时
业务程序执行耗时
根据程序的执行情况,我们就知晓各个工作单元的执行时间,然后设计优化方案。
如果你觉得不错,给个关注和好评吧~
边栏推荐
- 微信小程序获取用户手机号码
- 【云原生 · Kubernetes】部署Kubernetes集群
- Vs Shortcut Keys---Explore Different Programming
- 第4章 搭建网络库&Room缓存框架
- 【MySQL功法】第5话 · SQL单表查询
- Blazor Server(6) from scratch--policy-based permission verification
- 第3章 搭建短视频App基础架构
- Vs 快捷键---探索不一样的编程
- R语言拟合ARIMA模型并使用拟合模型进行预测推理、使用autoplot函数可视化ARIMA模型预测结果、可视化包含置信区间的预测结果
- thymeleaf中的日期格式转化
猜你喜欢
基于SSM和Web实现的农作物生长监控系统
Matlab学习10-图像处理之傅里叶变换
4500 words sum up, a software test engineer need to master the skill books
Explain the virtual machine in detail!JD.com produced HotSpot VM source code analysis notes (with complete source code)
Go 语言快速入门指南: 介绍及安装
622. 设计循环队列
第四课 标识符、关键字、变量、变量的分类和作用域、常量
【MySQL功法】第2话 · 数据库与数据表的基本操作
长城简漫·暑期安全篇⑤ 这个强,不能逞
How to do App Automation Testing?Practical sharing of the whole process of App automation testing
随机推荐
QGIS绘制演习区域示意图
从零开始C语言精讲篇5:指针
流式编程使用场景
劝退背后。
面试官:SOA 和微服务的区别?这回终于搞清楚了!
本周四晚19:00知识赋能第4期直播丨OpenHarmony智能家居项目之设备控制实现
分享一款实用的太阳能充电电路(室内光照可用)
【一起学Rust】Rust学习前准备——注释和格式化输出
LeetCode刷题笔记:105.从前序与中序遍历序列构造二叉树
小身材有大作用——光模块寿命分析(二)
Redis发布订阅和数据类型
R语言使用zoo包中的rollapply函数以滚动的方式、窗口移动的方式将指定函数应用于时间序列、计算时间序列的滚动标准差(设置每个窗口不重叠)
数据库系统原理与应用教程(073)—— MySQL 练习题:操作题 131-140(十七):综合练习
LeetCode-142. 环形链表 II
【一起学Rust 基础篇】Rust基础——变量和数据类型
OFDM 十六讲 4 -What is a Cyclic Prefix in OFDM
用C语言解决A+B问题,A-B问题,A*B问题
Take you understand the principle of CDN technology
mysql进阶(二十四)防御SQL注入的方法总结
第3章 搭建短视频App基础架构