有时候处理请求时,有些日志收尾工作,直接处理吧增加响应时间,建个job放队列处理又感觉没啥必要
比如记录访问者日志信息,我们会根据ip去调用go服务查询asn,country code,city,大致的经纬度,访问了资源会把访问次数+1
这两个任务开始的时候一个放队列处理,一个缓存访问量+1,差值达到阈值之后再保存落库。
Laravel的文档介绍了中间件的terminate方法,问题是可能还没开始处理请求,有些参数在中间件里拿不到。
这时候可以使用
public function test(Request $request)
{
$log = 'log msg';
$context = [
'request_id' => 'xxxx',
'client_ip' => $request->getClientIp(),
'time' => time()
];
//闭包里的代码是在将页面返回给用户客户端之后再执行的,不影响响应时间
\App::terminating(function () use ($log, $context) {
Log::info($log,$context);
});
return view('test');
}
用到的原理也是ob_start,ob_end_flush那些
以前写php还没用框架的时候会手动设置响应头,比如先echo了一个字符串,再调用header方法设置请求头就会报错,如果在入口文件开启ob_start就没问题