Table of Contents
佇列的功用
1、把緩慢的工作 (例如:傳送郵件…) 移出網頁的同步呼叫,以節省載入網頁的時間。
2、處理大量的 cron 工作。
佇列的設定檔
config/queue.php
建立可與佇列配合的工作 (Job)
工作 (Job) 是一種 Laravel 所提供的類別,他可以封裝我們想要完成的工作,也有能力可以加入佇列或從佇列中移除。
# 建立一個寄送通知信的工作
php artisan make:job MailNotificationJob
這會產生 app/Jobs/MailNotificationJob.php,其內容大致如下:
將工作加入佇列
// 方法一,在任何地方都可使用
diapatch(new \App\Jobs\MailNotificationJob($user));
// 方法二,在 Controller 中使用
public function index()
{
$user = auth()->user();
$this->dispatch(new \App\Jobs\MainNotificationJob($user));
}
啟動佇列工人
# 方法一
php artisan queue:listen
# 方法二
php artisan queue:work
# 指定運行時的參數
php artisan queue:work database --timeout=60 --sleep=5 --tries=2
錯誤處理
如果工作 (Job) 在執行的過程中有例外被丟出,佇列監聽器會將工作交回佇列;該工作會被不斷的再處理,直到成功或超過指定的重試次數(tries=n)。
超過重試次數的工作,會被移到 failed_jobs 資料表儲存。
在 Job 類別定義中,檢查重試次數:
public function handle()
{
...
if ($this->attemps() > 2) {
//
}
}
也可以定義一個方法,在工作失敗時執行
...
class MailNotificationJob implements ShouldQueue
{
...
public function failed()
{
// 當發生錯誤時,做點什麼事
}
}
在指令列透過 artisan 命令,和 failed_jobs 資料表互動
# 列出失敗工作的清單,這可以看到失敗工作的 ID
php artisan queue:failed
# 依 ID 重新執行失敗的工作
php artisan queue:retry 412
# 重新執行所有失敗的工作
php artisan queue:retry all
# 依 ID 刪除失敗的工作
php artisan queue:forget 413
# 刪除所有失敗的工作
php artisan queue:flush
將工作 (Job) 丟回佇列
public function handle()
{
...
if (SomeCondition) {
$this->release($delay_seconds)
}
}
$delay_seconds:等待 $delay_seconds 後,再重新執行此工作
刪除工作
在 Job 類別定義的 handle() 方法內,直接 return 即可刪除此工作。
Comments