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