佇列的功用

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 即可刪除此工作。

參考資料

Laravel Docs

Last modified: 2019-12-27

Author

Comments

Write a Reply or Comment

Your email address will not be published.