隊列(queue)與 Job - daniel-qa/Laradock GitHub Wiki

https://ithelp.ithome.com.tw/articles/10304035

一、隊列(queue)與 Job

queue 使用排隊方式將 Job 放入內, 在依照順序先進先出, 依序執行 Job

執行後完後可再對 Job 進行調整 e.g.

過程中有需求將 Job 刪除

修改 Job 排序延遲執行

將 Job 標記已處理

處理失敗標記已執行過一次, 重新放回到 queue 內等待下一次再執行

設定檔 config/queue.php

與 Storage 類似, 設定名稱與 儲存方式(driver)、儲存位置... 等

二、建立 Job

  1. 使用 artisan 建立
    php artisan make:job Usermailer
  1. 建立後 Job 會預先引入幾個特徵

Dispatchable: 引入一些 function 供 queue 操作 job

Queueable: 提供方法操作 Job 要放到哪一個 queue 中

InteractsWithQueue: 控制 job 與 queue 關係 e.g. 將 Job 重新加回 queue 中或從中刪除 Job

SerializesModel: (反)序列化 Eloquent model

三、指派 Job

1.全域 dispatch() 方法

    $userMailer = new UserMailer(3);
    
    \App\Jobs\Usermailer::dispatch($userMailer);

dispatch() 接其他方法設定指派方式

dispatch()->onConnection('redis') 設定要使用哪種方式加入 queue ( config/queue.php )

dispatch()->onQueue('high') 設定要推入哪一個 queue 名稱中

dispatch()->delay(5) 設定要延遲多久, 可以給秒數或是 DateTimeCarbon 實例

四、執行 queue

  1. artisan 執行
    php artisan queue:work
  1. queue:work 參數

後面第一個參數指定使用哪一個連結 ( config/queue.php )

--timeout 設定可執行時間長度

--sleep 設定每次執行 Job 間隔多久

--tries 設定最大嘗試執行 Job 次數

--queue=num1,num2 設定 queue num1 優先執行於 num2

  1. 失敗例外處理
  • function handle(): 每次執行 Job 時會同時執行 handle()

    public function handle() {
         // 判斷該 Jobs 已執行 5 次
         if ( $this->attempts() > 5 ) {
             // ... 要執行的動作
             // e.g. 移至執行失敗資料表
         }
    }
  • function failed(): Job 執行失敗時要做的事情`
    // 執行失敗會會移至 failed 資料表中
    public function failed() {
        // ... 失敗要做的事情
    }
  • 在 AppServiceProvider 的 boot() 方法建立全域 failed() 方法
    public function boot() {
        Queue::failing(function ( JobFailed $event ) {
            // ... 要做的事情
        }
    }
  • artisan failed 相關語法
    # 顯示失敗的 job 清單
    php artisan queue:failed

    # 使用 ID 重新執行失敗 Job
    php artisan queue:retry 9

    # 重新執行所有失敗 Job
    php artisan queue:retry all

    # 刪除失敗 Job
    php artisan queue:forget 5

    # 刪除所有失敗的 Job
    php artisan queue:flush
  1. 控制 queue
release() 將 Job 放回到 queue

若要在過程中刪除 Job, 可以下 return 表示該 Job 已完成不用回到 queue 中