Laravel的隊列系統(tǒng)默認是串行處理作業(yè)的,這意味著每個作業(yè)都要等待前一個作業(yè)處理完畢后才能開始處理。但是,有時候我們需要同時處理多個作業(yè),這就需要并發(fā)處理。
Laravel通過將隊列連接設置為"redis","database"或"beanstalkd"來實現(xiàn)并發(fā)處理。這些連接可以處理多個并發(fā)作業(yè)。
Laravel隊列系統(tǒng)還支持作業(yè)優(yōu)先級,這意味著我們可以為不同類型的作業(yè)分配不同的優(yōu)先級。優(yōu)先級高的作業(yè)將在優(yōu)先級低的作業(yè)之前處理。優(yōu)先級默認為0,值越高表示優(yōu)先級越高。
(相關資料圖)
我們可以使用--queue
選項在調(diào)度作業(yè)時指定作業(yè)隊列。例如,我們可以使用以下代碼將作業(yè)推送到"high"隊列:
ProcessPodcast::dispatch($podcast)->onQueue("high");
然后,我們可以使用以下命令啟動一個專用的隊列進程來處理高優(yōu)先級隊列:
php artisan queue:work --queue=high
如果一個作業(yè)執(zhí)行時間過長,可能會導致隊列堵塞,這就需要設置作業(yè)的超時時間。Laravel默認的作業(yè)超時時間為60秒。
我們可以在定義作業(yè)類時使用--timeout
選項來設置超時時間。例如,以下代碼設置超時時間為120秒:
php artisan make:job ProcessPodcast --timeout=120
如果作業(yè)在超時時間內(nèi)沒有處理完成,Laravel將嘗試終止該作業(yè)并將其標記為失敗。
Laravel隊列系統(tǒng)默認會自動重試作業(yè),如果一個作業(yè)失敗了,它將被重新推送到隊列中,直到達到最大嘗試次數(shù)。最大嘗試次數(shù)默認為3,可以在config/queue.php
中進行配置。
如果要禁用作業(yè)重試,我們可以在定義作業(yè)類時使用--tries
選項將最大嘗試次數(shù)設置為0:
php artisan make:job ProcessPodcast --tries=0
如果一個作業(yè)達到最大嘗試次數(shù)仍然失敗,它將被標記為失敗。Laravel默認會將失敗的作業(yè)寫入日志文件。我們還可以在config/queue.php
中配置將失敗的作業(yè)發(fā)送到其他通知渠道,例如電子郵件或Slack。
當然,我們還可以通過手動調(diào)用fail
方法來標記一個作業(yè)為失?。?/p>
/** * Execute the job. * * @return void */public function handle(){ if ($this->somethingWentWrong()) { $this->fail(new Exception("Something went wrong.")); } // Process the podcast...}
關鍵詞: