laravel隊(duì)列文檔
1.概念理解
連接(connections ):config/queue.php
中有一個(gè)connections
配置選項(xiàng)龙巨,你可以選擇redis傲绣、數(shù)據(jù)庫(kù)、 Amazon SQS阳液,Beanstalk等作為隊(duì)列的驅(qū)動(dòng)余赢。
隊(duì)列(queue):在一個(gè)連接中可以存在多個(gè)隊(duì)列,每個(gè)隊(duì)列處理各種的任務(wù)愕难,隊(duì)列名稱可以根據(jù)需求自己定義早龟。
2.修改配置文件
修改.env文件對(duì)應(yīng)的配置
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
3.job文件
-
首先要生成job文件,命令:
php artisan make:job Logs
這樣Logs.php文件就會(huì)被默認(rèn)聲稱在app/Jobs目錄下猫缭,你可以吧這個(gè)文件移到你的模塊下面(記著要改命名空間!)
在構(gòu)造方法中你可以設(shè)置連接葱弟、隊(duì)列、嘗試次數(shù)猜丹、超時(shí)時(shí)間等芝加。
public function __construct(EntityLog $logEntity)
{
$this->connection = 'redis';//使用的連接(該連接的意思是你存入數(shù)據(jù)時(shí)使用的連接,運(yùn)行隊(duì)列的時(shí)候還需要設(shè)置連接射窒,后面會(huì)提到)
$this->queue = 'logs'; //使用的隊(duì)列(該隊(duì)列的意思是你存入數(shù)據(jù)時(shí)使用的隊(duì)列藏杖,運(yùn)行隊(duì)列的時(shí)候還需要設(shè)置隊(duì)列,后面會(huì)提到)
$this->tries = 3; //任務(wù)可以嘗試最大次數(shù)
$this->timeout = 10; //任務(wù)可以執(zhí)行的最大秒數(shù) (超時(shí)時(shí)間)脉顿。
$this->logEntity = $logEntity;
}
-
在
handel
方法(自動(dòng)生成的)中蝌麸,寫(xiě)自己的邏輯,handel方法的參數(shù)可以注入,如下:/** * Execute the job. * @param:$logRepository 注入的倉(cāng)庫(kù) * @return void */ public function handle(LogRepositoryInterFace $logRepository) { //調(diào)用Repository save方法 $logRepository->save($this->logEntity); }
我這里執(zhí)行的是把傳入的log實(shí)體傳入log倉(cāng)庫(kù)的save方法中艾疟,來(lái)進(jìn)行保存日志的操作
-
你可以直接在任務(wù)類中定義
failed
方法来吩,允許你在任務(wù)失敗時(shí)執(zhí)行針對(duì)于該任務(wù)的清理工作,如發(fā)送通知德能/** * 任務(wù)失敗的處理過(guò)程 * * @param Exception $exception * @return void */ public function failed(Exception $exception) { // 給用戶發(fā)送任務(wù)失敗的通知,等等…… log::info('日志記錄失敗'); }
4.使用隊(duì)列分發(fā)任務(wù)
一旦你寫(xiě)完了你的任務(wù)類你就可以使用它自帶的 dispatch
方法分發(fā)它蔽莱。傳遞給 dispatch
方法的參數(shù)將會(huì)被傳遞給任務(wù)的構(gòu)造函數(shù)
//存入隊(duì)列
Logs::dispatch($logEntity);
5.運(yùn)行隊(duì)列
-
可以在命令行直接命令:
php artisan queue:work redis --queue=logs
這里的
redis
就是運(yùn)行時(shí)使用的連接弟疆,--queue=log
是運(yùn)行時(shí)使用的隊(duì)列,它會(huì)一直運(yùn)行直到它被手動(dòng)停止(ctrl+c)或終端被關(guān)閉盗冷。
-
也可以使用supervisor來(lái)運(yùn)行和管理
Supervisor 是 Linux 操作系統(tǒng)下中的一個(gè)進(jìn)程監(jiān)控器怠苔,它可以在
queue:work
掛掉時(shí)自動(dòng)重啟之。-
在 Ubuntu 上安裝 Supervisor仪糖,你可以使用如下命令:
sudo apt-get install supervisor
-
配置supervisor
[program:logs] process_name=%(program_name)s_%(process_num)02d command=php /home/vagrant/code/plato2/artisan queue:work redis --queue=logs autostart=true autorestart=true user=root numprocs=8 redirect_stderr=true stdout_logfile=/home/vagrant/code/plato2/storage/logs/worker.log
這里
user
填寫(xiě)網(wǎng)站運(yùn)行進(jìn)程的用戶柑司,如www或者rootnumprocs
表示啟動(dòng)多少個(gè)進(jìn)程來(lái)監(jiān)聽(tīng)Laravel
隊(duì)列command一行的artisan路徑要改成自己的項(xiàng)目路徑,
stdout_logfile 也要改成自己的路徑
-
啟動(dòng)supervisor
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start logs:*
這里值得注意的是,如果 Laravel 處理隊(duì)列的代碼更改了乓诽,需要重啟 Supervisor 的隊(duì)列管理才能生效
-
其他的supervisor命令
sudo supervisorctl status logs:*(查看進(jìn)程運(yùn)行狀態(tài)) sudo supervisorctl stop log:*(關(guān)閉logs開(kāi)頭的進(jìn)程)
-