Laravel Queue

建立時間: 2017-11-02 15:31:39
更新時間: 2017-11-03 00:17:49

本篇使用Laravel版本為5.3

Queue Drive為Database

 

什麼是Queue?

Queue的直譯是佇列

有些需要處理比較久的事情像是寄信推播發簡訊

這些事如果是realtime來處理

往往會讓response很久

如果是丟給Queue處理

response就可以直接回應

下面範例以寄信為例

 

原理

通常使用Queue的時候會一個類似管理者的角色叫Job Server

Job Server就是收到要做的Job(工作)後

將這些Job(工作)分派給worker(工人)執行

 

Queue Driver

首先要選擇Queue Driver

Laravel預設有下列幾種Driver

這邊使用Database來做Queue Driver

所以先到.env設定Queue Driver

 QUEUE_DRIVER=database

 

建立Job

 php artisan make:job SendEmailJob

 

程式的部份主要分成constructhandle

主要就看要如何實做

重點就是把要做很久的事情放在Job內執行

這邊是要寄信

 <?php
 
 namespace App\Jobs;
 
 use Illuminate\Bus\Queueable;
 use Illuminate\Queue\SerializesModels;
 use Illuminate\Queue\InteractsWithQueue;
 use Illuminate\Contracts\Queue\ShouldQueue;
 use Illuminate\Support\Facades\Mail;
 use App\Mail\Send;
 class SendEmailJob implements ShouldQueue
 {
     use InteractsWithQueue, Queueable, SerializesModels;
     protected $to;
     public function __construct($to, $config, $data)
     {
         $this->to = $to;
         $this->config = $config;
         $this->data = $data;
     }
 
 
     public function handle()
     {
         // 要處理比較久的事情就丟這裡
         Mail::to($this->to)->queue(new Send($this->config, $this->data));
     }
 }
 

 

Dispatching Jobs

Job設定好後

就能發出請求

假設我們要在新訂單成立時發信

 <?php
 
 namespace App\Http\Controllers;
 use App\Jobs\SendEmailJob;
 
 class OrderController extends BaseController
 {
       // 建立新訂單
       public function create() {
           // 建立訂單...
           $to = 'example@gmail.com';
           $config = [
               'subject' => '新訂單通知信件',
           ];
           $data = [
               'order_id' => $order->id,
               'member' => $order->member,
           ];
 
           // job請求
           $job = (new SendEmailJob($to, $config, $data));
           dispatch($job);
 
           return response('success', 200);
       }
 }

 

設定Supervisor

Supervisor是一套實做Job Server的軟體

 

而且當worker執行任務掛掉時

他能夠讓worker復活重新執行任務

 

首先要先安裝Supervisor

 sudo apt-get install supervisor

 

前往/etc/supervisor/conf.d加入設定檔laravel-worker.conf

這邊其實就是不斷的執行artisan queue:work --sleep=3 --tries=3

 

 [program:laravel-worker]
 process_name=%(program_name)s_%(process_num)02d
 command=php /path/to/laravel/artisan queue:work --sleep=3 --tries=3
 autostart=true
 autorestart=true
 user=username
 numprocs=8
 redirect_stderr=true
 stdout_logfile=/path/to/log/worker.log

 

接著啟用Supervisor

 sudo supervisorctl reread
 
 sudo supervisorctl update
 
 sudo supervisorctl start laravel-worker:*

到這邊為止我們就能利用Queue來寄信

讓我們請求的時間加速

之前原本寄信請求幾乎都要四五秒左右

寄信換成Queue後使用者體驗非常好

而且也能避免因為寄信出錯

造成請求回應失敗

讓使用者覺的莫名其妙

 

更多設定請參考官方文件