如何在Laravel使用 Job、Queue、Supervisor

這篇記錄一下實做過程的步驟和遇到的問題,
避免以後忘記了又要重新再學一次

本篇分為3個部分:
1. 如何配置和分派任務
2. CentOS 7 執行 Supervisor
3. Laradock執行 Supervisor


如果用 database 當作紀錄工具,首先需要生成一個 table,預設名稱是 jobs

php artisan queue:table 
php artisan migrate

然後找到 .env 這隻檔案的 QUEUE_DRIVER,調整如下QUEUE_DRIVER=database #原本是sync,看需求也可改為redis

然後生成一個:可派發任務的 job class

php artisan make:job ProcessJob # 名稱隨你取

然後這個檔案會存在於 app/Jobs 路徑底下

ProcessJob

// 任務生存時間
 public $timeout = 60;// 想傳遞進來的參數
 protected $id;/**
  * 實例化
  */
 public function __construct($id)
 {
   $this->id = $id;
 } /**
  * 要做的事放這裡
  */
 public function handle()
 {
   doSomething($this->id);
 }
}

然後在任何地方 ,例如 route/web.php 內,或是 XxxController.php 內引用 ProcessJob 這個 class 後就可以使用 dispatch() 這個 function 去派發任務到 queue ,然後在 database 的
jobs table裡面就可以看到一堆等待執行的任務了~# 實例化的時候就要把參數丟進,不然 ProcessJob 就會報錯 (參數數量不對...)
$job = new ProcessJob($id);# dispatch 的時候也要再丟一次參數(不是new的時候給過了嗎? 有朋友能幫忙解惑嗎?)
$job->dispatch($id)->onQueue('queue_num_1')->delay(10);### ps. onQueue、delay 為選填項目,分別為頻道和任務延遲執行時間 ###

單執行序監聽php artisan queue:work

執行後,如果有任務就會執行,否則就會持續監聽等待任務


多執行序監聽Supervisor

下面分一般 linux 執行supervisor,和 Laradock 環境執行supervisor,其實都是執行Supervisor的流程

一般 Linux 執行supervisor

過程中遇到了一些問題,然後是參考這兩個網站的內容
Centos7.3配置Supervisor遇到的一些小问题
Why I get this error laravel-worker: ERROR (no such group)

首先要先安裝套件

yum install -y supervisor
cd /etc/supervisord.d // 然後你可以在這個路徑底下寫一個設定檔 
vi laravel-worker.ini // 注意副檔名

官網寫預設是在這個路徑底下 /etc/supervisor/conf.d
寫一份這檔名的檔案 laravel-worker.conf
然後你就會看到噴錯啦!!!
因為在 /etc/supervisord.conf裡寫的是[include]
files = supervisord.d/*.ini

然後在 laravel-worker.ini這份檔案裡

[program:laravel-worker]  # 啟動時需要這個名稱 
process_name=%(program_name)s_%(process_num)02d
command=php /[laravel-workspace]/artisan
# artisan 的路徑要自己調整,下是可選參數  
# database/redis        driver 
# --queue=
autostart=true 
autorestart=true 
user=root               # 執行人 
numprocs=8              # 執行序數量 
redirect_stderr=true 
stdout_logfile=/home/forge/app.com/worker.log

寫好了以後可以照官網寫的順序啟動

啟動 Supervisor

一旦設定檔案被建立,你可以使用以下指令更新及啟動 Supervisor:

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

Laradock 環境執行supervisor

依照Laradock官方文件內容:在 php-worker 目錄下先複製這個檔案laravel-worker.conf.example => laravel-worker.conf

內容大致和上面的 laravel-worker.ini內容相同、主要調整 command 的部分後就可以執行docker-compose up -d --build php-worker

之後便會自行啟動監聽,可以執行下列指令查看:docker exec -it laradock_php-worker_1 top

會看到有多個執行序

如果沒有正常執行等待中的任務,可以嘗試執行

supervisorctl reread

或是修改laravel-worker.conf 指定監聽某個頻道 --queue=? 後重新 build
然後執行上面的 reread …

到此完結~ 謝謝收看