2017-10-12 61 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接口的事件。

相關問題