2017-10-12 9 views
1

私はいくつかのAPIリクエストを記録します。現在同期が行われており、実際のAPI呼び出しの応答時間を短縮するために、このDB呼び出しを非同期で処理したいと考えています。 Laravelでこれを行う方法はキュー/ジョブシステムのようです。これは、単純なログエントリはDBに追加された場合であればしかし、私はわからない:laravel DBにログするためのキュージョブ?

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

だから、私は仕事を作成し、このためにそれを派遣する必要がありますか?余分なもののようにキューの作業者とこれのためのすべての定型句を持っているようです。

EDIT: キューがジョブテーブルに書き込む必要があるため、これはとにかくばかばかしいかもしれません。だから何かをキューイングするには1 DBクエリが必要です。 したがって、単一のクエリアクションに対してジョブを使用することはおそらくありません。

レスポンス後までログの実行を延期する方法はありますか?

+0

最初に行う必要があるのは、この要求が実際に各要求にどれだけ追加されたかを判断することです。すべての可能性として、シリアライズとキューイングはまったく遅いかもしれません – apokryfos

答えて

2

最高のことは、終了可能なミドルウェア内にログを記録することです。あなたのKernel.php

//... 
protected $middlewareGroups [ 
    //... 
    "api" => [ 
      //Other middleware 
      LogMiddleware::class 
     ] 
]; 

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(); 
     } 
} 

今、すべてのAPIリクエストが記録されます。これは、応答がクライアントに送信された後に発生します。要求/応答サイクルはより早く終了しませんが、クライアントはロギングが発生する前に応答を受信します(ロギング遅延を認識しません)。

0

Redisのような別のキュードライバを使用して、ShouldQueueインターフェイスを実装するイベントを、api要求が行われるたびに(またはapi要求をログに記録するたびに)発生させることができます。

関連する問題