我记录了一些api请求。它目前已完成同步,我想处理此数据库调用异步,以便为实际的api调用提供更快的响应时间。 在Laravel中这样做的方式似乎是队列/工作系统。但是我不确定添加到DB的简单日志条目是否也是这种情况:
$log = new Log();
$log->request = $request->all();
$log->response = $response;
$log->save();
那么,我应该创建一份工作并为此调度吗?看起来像过度使用队列工作者和所有样板文件只是为了这个。
编辑: 我只是意识到这可能是愚蠢的,因为队列也需要写入jobs表。排队的东西需要1个DB查询,对吧? 因此,对单个查询操作使用作业可能没有意义。
还有其他方法可以将响应的执行推迟到响应之后吗?
答案 0 :(得分:2)
最好的办法就是登录可终止的中间件。
class LogMiddleware {
public function handle($request, $next) {
return $next($request); //Passthrough
}
public function terminate($request,$response) {
$log = new Log();
$log->request = $request->all();
$log->response = $response;
$log->save();
}
}
在你的Kernel.php中
//...
protected $middlewareGroups [
//...
"api" => [
//Other middleware
LogMiddleware::class
]
];
现在将记录每个API请求。响应发送到客户端后会发生这种情况。请求/响应周期不会更快地终止,但客户端将在记录发生之前收到响应(因此不会感知任何记录延迟)。
答案 1 :(得分:0)
您可以使用其他队列驱动程序(如Redis),然后在每次发出api请求时(或每次要记录api请求时)触发实现ShouldQueue接口的事件。