使用場景:處理一些耗時或者高并發(fā)的操作周荐,把操作放到隊列中異步執(zhí)行城丧,可以有效緩解系統(tǒng)壓力宛篇、提高系 統(tǒng)響應(yīng)速度和負(fù)載能力。常見的場景有群發(fā)郵件或秒殺等等跌捆。Laravel支持多種隊列實現(xiàn)的驅(qū)動徽职,本文主要以Redis進(jìn)行說明。
一佩厚、安裝Redis驅(qū)動
修改composer.json文件姆钉,如下:
"require": {
? ? ? ? ?"php":">=5.6.4",
? ? ? ? ?"laravel/framework":"5.4.*",
? ? ? ? ?"laravel/tinker":"~1.0",
? ? ? ? ?"predis/predis":"1.0.*",
? ? ? ? ?"dingo/api":"1.0.*@dev",
},
執(zhí)行composer update即可完成安裝
二、配置Redis的連接
修改.env文件抄瓦,如下:
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=1234qwer
REDIS_PORT=6379
三潮瓶、修改默認(rèn)的隊列驅(qū)動
修改.env文件,如下:
QUEUE_DRIVER=redis
四钙姊、編寫任務(wù)類
php artisan make:job QueueDemo
五筋讨、其他
最大失敗次數(shù)設(shè)置,在任務(wù)類增加屬性:
public ?$tries=5;
超時設(shè)置摸恍,在任務(wù)類增加屬性【隊列任務(wù)最大運(yùn)行時長(秒)】:
public ?$timeout=120;
timeout 與 retry_after的區(qū)別查看地址
六、分發(fā)任務(wù)
分發(fā)任務(wù)到指定的 連接與隊列
dispatch(new DemoQueue('李四'))->onConnection('redis')->onQueue('exam');
分發(fā)任務(wù)到指定的隊列
dispatch(new DemoQueue('李四'))->onQueue('exam');
七赤屋、運(yùn)行隊列監(jiān)聽器
指定 連接&隊列
php artisan queue:work redis --queue=exam
注意:隊列進(jìn)程開始運(yùn)行后立镶,會持續(xù)監(jiān)聽隊列,直至你手動停止或關(guān)閉終端类早;為了保持隊列進(jìn)程queue:work持續(xù)在后臺運(yùn)行媚媒,需要使用進(jìn)程守護(hù)程序,比如Supervisor來確保隊列進(jìn)程持續(xù)運(yùn)行涩僻。隊列進(jìn)程是長生命周期的進(jìn)程缭召,會在啟動后駐留內(nèi)存。若應(yīng)用有任何改動將不會影響到已經(jīng)啟動的進(jìn)程逆日。所以請在發(fā)布程序后嵌巷,重啟隊列進(jìn)程。
八室抽、其他
進(jìn)行休眠時間
當(dāng)任務(wù)在隊列中有效時搪哪,進(jìn)程會持續(xù)處理任務(wù),沒有延遲坪圾。不過晓折,我們可以使用sleep配置項來指定沒有新的有效任務(wù)產(chǎn)生時的休眠時間:
php artisan queue:work –sleep=3