2017-03-23 7 views
2

私は自分のサイトを最適化しようとしています。すべてのページの読み込みと終了時に、アナリティクスのメトリック(ページ上の時間、IPアドレスなど)を保存します。しかし、これは私のサーバー上でかなりの大きさのボトルネックです。物事を実行するのにかかる時間を見ると、私の全機能は1〜2msかかるので、DBに保存するには約100〜200msかかります。だから私の目標は、私の機能を実行し、新しい仕事を派遣することです、それはメトリックの実際の節約を行うでしょう。このようにして、私のモデルのすべての保存をキューにオフロードすることができます。私は私がこれを実行するようだが、何もしていないようです。このLaravel 5.4非同期キューによるモデルの保存

dispatch(new SaveMetric($newMetric)); 

を実行する必要があるすべての値をつかむした後、以下の私のコントローラ機能で

class SaveMetric implements ShouldQueue 
{ 
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 
    /** 
    * Create a new job instance. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle(Metrics $metric) 
    { 
     // 
     $metric->save(); 
    } 
} 

そして、私の仕事のコピーです。何か不足していますか? (Edit)これは何か〜何もしないで新しいメトリックを作成したかのように、レコードをすべてのフィールドにnullでDBに保存するだけです。

  • キューをジョブディスパッチに渡す必要がありますか?
  • キュー内のものを実際に処理するためにデーモンなどを実行する必要がありますか?

私は職人のメイクを使用してジョブを作成し、ジョブコマンド

答えて

2

あなたは非常に近いです。

class SaveMetric implements ShouldQueue 
{ 
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; 

    protected $metric; 

    /** 
    * Create a new job instance. 
    * 
    * @param Metrics $metric 
    */ 
    public function __construct(Metrics $metric) 
    { 
     $this->metric = $metric; 
    } 

    /** 
    * Execute the job. 
    * 
    * @return void 
    */ 
    public function handle() 
    { 
     $this->metric->save(); 
    } 
} 

the docsによると:この例では

は、私たちがキューに入れられたジョブのコンストラクタに直接雄弁モデルを渡すことができたことに注意してください。ジョブが使用しているSerializesModels特性のため、ジョブが処理されているときに、Eloquentモデルは正常にシリアル化され、シリアル化されません。キューに入れられたジョブがそのコンストラクターでEloquentモデルを受け入れる場合、モデルの識別子だけがキューにシリアル化されます。ジョブが実際に処理されると、キュー・システムはデータベースから完全モデル・インスタンスを自動的に再取得します。

+1

これは、SerializesModelsの特性を削除することで、私の意図した動作になりました。 – CMOS

+0

ありがとうございました!はい、私は 'SerializesModels'特性も削除しなければなりませんでした。これは、私のJobが' BaseModel'を継承するクラスを保存できるようにするためです。 – Ryan

関連する問題