2017-10-12 100 views
1

我记录了一些api请求。它目前已完成同步,并且我希望处理此数据库调用异步以允许实际api调用的更快响应时间。 在Laravel中这样做的方式似乎是队列/工作系统。但是我不知道这是否也是加入DB简单的日志条目的情况:laravel队列作业登录到数据库?

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

所以,我应该创建一个作业,并派遣它呢?看起来像矫枉过正有一个队列工作者和所有的样板只是为了这个。

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

有没有其他的方式推迟日志的执行,直到响应之后?

+0

您需要做的第一件事是确定这个*真正*添加到每个请求的开销。序列化和排队的可能性完全一样慢 – apokryfos

回答

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请求将被记录。响应发送到客户端后会发生这种情况。请求/响应周期不会更快终止,但客户端将在日志记录发生之前收到响应(因此不会察觉到任何记录延迟)。

0

您可以使用不同的队列驱动程序(如Redis),然后在每次发出api请求(或每次希望记录api请求时)时触发实现ShouldQueue接口的事件。