2017-03-23 28 views
2

所以我想優化我的網站,並在每一頁加載和退出我保存一個度量(時間在頁面上,IP地址等)的分析。然而,這些都是我的服務器上體面大小的瓶頸。當查看運行所需的時間時,我的整個功能花費大約1-2ms,然後保存到DB需要大約100-200ms。所以我的目標是運行我的功能,然後派遣一個新的工作,這將做到實際的度量保存。這樣,我的模型的所有保存都可以卸載到隊列中。下面是我的工作在我的控制器功能的副本Laravel 5.4通過異步隊列保存模型

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

再經過我搶,我需要我運行這個

dispatch(new SaveMetric($newMetric)); 

這似乎運行,但似乎並沒有做任何事情的所有值。我錯過了什麼嗎? (編輯)這是〜東西〜它只是將所有字段中的記錄保存到數據庫中,如同我創建了一個沒有任何值的新度量。

  • 是否需要將隊列傳遞給作業調度?
  • 我是否需要運行一個守護進程或類似的東西來實際處理隊列中的內容?

我創建使用工匠使工作:

回答

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