iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
自我挑戰組

laravel+vue 學習系列 第 29

Day29. Laravel Job

  • 分享至 

  • xImage
  •  

一、隊列(queue)與 Job

  1. queue 使用排隊方式將 Job 放入內, 在依照順序先進先出, 依序執行 Job
  2. 執行後完後可再對 Job 進行調整 e.g.
    • 過程中有需求將 Job 刪除
    • 修改 Job 排序延遲執行
    • 將 Job 標記已處理
    • 處理失敗標記已執行過一次, 重新放回到 queue 內等待下一次再執行
  3. 設定檔 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
  2. 失敗例外處理

    • 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
    
  3. 控制 queue

    • release() 將 Job 放回到 queue
        if ( false ) {
            $this->release(5);
        }
    
    • 若要在過程中刪除 Job, 可以下 return 表示該 Job 已完成不用回到 queue 中

上一篇
Day28. 帳號授權與角色
下一篇
Day30. Vue 整理
系列文
laravel+vue 學習32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言