用于记录到DB的laravel队列作业?

时间:2017-10-12 14:15:33

标签: php laravel queue jobs

我记录了一些api请求。它目前已完成同步,我想处理此数据库调用异步,以便为实际的api调用提供更快的响应时间。 在Laravel中这样做的方式似乎是队列/工作系统。但是我不确定添加到DB的简单日志条目是否也是这种情况:

$log = new Log();
$log->request = $request->all();
$log->response = $response;
$log->save();

那么,我应该创建一份工作并为此调度吗?看起来像过度使用队列工作者和所有样板文件只是为了这个。

编辑: 我只是意识到这可能是愚蠢的,因为队列也需要写入jobs表。排队的东西需要1个DB查询,对吧? 因此,对单个查询操作使用作业可能没有意义。

还有其他方法可以将响应的执行推迟到响应之后吗?

2 个答案:

答案 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接口的事件。