隊列(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
- 使用 artisan 建立
php artisan make:job Usermailer
- 建立後 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
- artisan 執行
php artisan queue:work
- queue:work 參數
後面第一個參數指定使用哪一個連結 ( config/queue.php )
--timeout 設定可執行時間長度
--sleep 設定每次執行 Job 間隔多久
--tries 設定最大嘗試執行 Job 次數
--queue=num1,num2 設定 queue num1 優先執行於 num2
- 失敗例外處理
- 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
- 控制 queue
release() 將 Job 放回到 queue
若要在過程中刪除 Job, 可以下 return 表示該 Job 已完成不用回到 queue 中