Laravel 隊(duì)列為不同的后臺(tái)隊(duì)列服務(wù)提供統(tǒng)一的 API,例如 Beanstalk,Amazon SQS,Redis,甚至其他基于關(guān)系型數(shù)據(jù)庫的隊(duì)列。隊(duì)列的目的是將耗時(shí)的任務(wù)延時(shí)處理,比如發(fā)送郵件,從而大幅度縮短 Web 請(qǐng)求和相應(yīng)的時(shí)間。
驅(qū)動(dòng)的必要設(shè)置
Database //需要數(shù)據(jù)表來存儲(chǔ),可以用artisan生成
php artisan queue:table
php artisan migrate
?Redis
為了使用?redis?隊(duì)列驅(qū)動(dòng),你需要在?config/database.php?配置文件中配置 Redis 的數(shù)據(jù)庫連接。
創(chuàng)建任務(wù)
生成任務(wù)類:php artisan make:job ProcessPodcast? // app/Jobs文件夾下
任務(wù)類__construct 方法 傳遞對(duì)象屬性
任務(wù)類handle方法 處理具體任務(wù)
分發(fā)任務(wù)
一旦你寫完了你的任務(wù)類你就可以使用它自帶的?dispatch?方法分發(fā)它。傳遞給?dispatch?方法的參數(shù)將會(huì)被傳遞給任務(wù)的構(gòu)造函數(shù):
ProcessPodcast::dispatch($podcast);//分發(fā)到配置的default的隊(duì)列中
ProcessPodcast::dispatch($podcast) ->delay(now()->addMinutes(10));//延時(shí)10分鐘發(fā)布
ProcessPodcast::dispatch($podcast)->onQueue('processing');//?分發(fā)任務(wù)到指定隊(duì)列(processing)
ProcessPodcast::dispatch($podcast)->onConnection('sqs');//分發(fā)任務(wù)到指定連接(sqs)
public $tries = 5;//任務(wù)可以嘗試的最大次數(shù)。
?public function retryUntil(){ return now()->addSeconds(5);}/**? 定義任務(wù)超時(shí)時(shí)間 , 在該時(shí)間內(nèi)無限次嘗試*/
運(yùn)行隊(duì)列處理器
php artisan queue:work //監(jiān)聽所有鏈接的default隊(duì)列
php artisan queue:work --once //?執(zhí)行單一任務(wù)
php artisan queue:work redis //?指定連接
php artisan queue:work redis --queue=emails //指定隊(duì)列
php artisan queue:work --queue=high,low //隊(duì)列優(yōu)先級(jí),high 與low 都是隊(duì)列名
php artisan queue:restart // 重啟
php artisan queue:work --sleep=3 //隊(duì)列進(jìn)程睡眠時(shí)間
如果指定非default的隊(duì)列,需要執(zhí)行指定隊(duì)列的命令來運(yùn)行
Supervisor 配置
sudo apt-get install supervisor //linux 安裝
一般 Supervisor 的配置文件存儲(chǔ)在?/etc/supervisor/conf.d?目錄
cd?/etc/supervisor/conf.d?
vim?laravel-worker.conf
//conf文件內(nèi)容
[program:laravel-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /home/forge/app.com/artisan queue:work sqs --sleep=3 --tries=3
autostart=true
autorestart=true
user=forge
numprocs=8
redirect_stderr=true
stdout_logfile=/home/forge/app.com/worker.log
//啟動(dòng)supervisor
sudo supervisorctl rereadsudo supervisorctl update
sudo supervisorctl start laravel-worker:*
sudo supervisorctl reload
處理失敗的任務(wù)
//使用數(shù)據(jù)庫database
php artisan queue:failed-table
php artisan migrate