如何在Laravel使用 Job、Queue、Supervisor

平民百姓
6 min readDec 9, 2019

--

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

本篇分為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 路徑底下

class ProcessJob implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
// 任務生存時間
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 supervisorcd /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 queue:work database# artisan 的路徑要自己調整,下是可選參數
# database/redis driver
# --queue=
queue_num_1 監聽頻道
# --sleep=3 無任務時休息時間
# --tries=3 retry 次數
# --delay=5 retry 中間的間隔時間
autostart=true
autorestart=true
user=root # 執行人
numprocs=8 # 執行序數量
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log

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

啟動 Supervisor

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

sudo supervisorctl rereadsudo supervisorctl updatesudo 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

會看到有多個執行序

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

docker exec -it laradock_php-worker_1 supervisorctl reread
docker exec -it laradock_php-worker_1 supervisorctl update
docker exec -it laradock_php-worker_1 supervisorctl laravel-worker:*

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

到此完結~ 謝謝收看

--

--

平民百姓
平民百姓

Written by 平民百姓

由後端轉全端的弱弱工程師 - 生活筆記

No responses yet