如果用 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)02dcommand=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 …