隊列如何使用

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 reread

sudo supervisorctl update

sudo supervisorctl start laravel-worker:*

sudo supervisorctl reload



處理失敗的任務

//使用數據庫database

php artisan queue:failed-table

php artisan migrate

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容