swof代码中的首页代码来示范
代码语言:javascript复制 */public function index(): Response{ /** @var Renderer $renderer */ $renderer = Swoft::getBean('view'); $content = $renderer->render('home/index'); $end_time = microtime(true); return context()->getResponse()->withContentType(ContentType::HTML)->withContent($content);}
当我们想对上边的代码加一个运行时间是,按照之前的写法,我们可能会写成这样:
代码语言:javascript复制/** * @RequestMapping("/") * @throws Throwable */public function index(): Response{ $begin_time = microtime(true); // 获取一个毫秒时间 /** @var Renderer $renderer */ $renderer = Swoft::getBean('view'); $content = $renderer->render('home/index'); $end_time = microtime(true); // 在获取一个毫秒时间 vdump("运行时间为:", round(($end_time - $begin_time) * 1000, 3)); // 拿开始时间减去结束时间 乘以1000 得到一个描述,在保留3位小数 return context()->getResponse()->withContentType(ContentType::HTML)->withContent($content);}
运行结果是这样的:(在控制台中查看结果)
代码语言:javascript复制PRINT ON AppHttpControllerHomeController(41):string(16) "运行时间为:"float(2.058)
这样有个缺点就是,只是计算了当前$bengin_time
与$end_time
之间代码的运算时间,并且我们修改了原方法,那么我们如何才能不通过修改源代码的方式,也能得到运算时间呢?
我们首先先顶一个切面类,类似于这样:
代码语言:javascript复制<?php declare(strict_types=1); namespace AppAspect; use AppHttpControllerHomeController;use SwoftAopAnnotationMappingAfter;use SwoftAopAnnotationMappingAspect;use SwoftAopAnnotationMappingBefore;use SwoftAopAnnotationMappingPointBean;use SwoftAopPointJoinPoint; /** * @Aspect(order=1) # 优先级, 数字越小则优先执行。 * * @PointBean(include={HomeController::class}) # 这里指的是定义切入目标。注意需要use引入一下这个类 */class YingxiaozhuAspect { /** @var float 执行开始 */ private $time_begin; /** * 前置通知 * * @Before() */ public function beforeAdvice() { // 起点时间 $this->time_begin = microtime(true); } /** * 后置通知 * * @After() * * @param JoinPoint $joinPoint */ public function afterAdvice(JoinPoint $joinPoint) { /** @var float 执行结束 */ $timeFinish = microtime(true); $method = $joinPoint->getMethod(); $runtime = round(($timeFinish - $this->time_begin) * 1000, 3); echo "{$method} 方法,本次执行时间为: {$runtime}ms n"; }}
重启服务,访问首页查看一下结果:
代码语言:javascript复制index 方法,本次执行时间为: 4.072ms