Laravel发送响应return后执行代码

有时候处理请求时,有些日志收尾工作,直接处理吧增加响应时间,建个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就没问题