這篇文章主要介紹了Laravel的隊(duì)列機(jī)制怎么用,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
成都創(chuàng)新互聯(lián)公司專注于企業(yè)全網(wǎng)整合營(yíng)銷(xiāo)推廣、網(wǎng)站重做改版、米東網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、成都h5網(wǎng)站建設(shè)、商城建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站制作、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為米東等各大城市提供網(wǎng)站開(kāi)發(fā)制作服務(wù)。
首先,我們要知道為什么要使用隊(duì)列,不使用隊(duì)列會(huì)怎么樣!優(yōu)缺點(diǎn)如何
我們可以舉例 幾個(gè)簡(jiǎn)單場(chǎng)景。
郵件發(fā)送
郵件發(fā)送一般會(huì)面臨哪些問(wèn)題??
發(fā)送緩慢
發(fā)送失敗
發(fā)送頻率過(guò)高,被服務(wù)商拒絕 又或者 被進(jìn)入垃圾箱
使用隊(duì)列的好處在與哪里
提高客戶端響應(yīng)
當(dāng)發(fā)送時(shí),我們不要立即處理,而是丟給服務(wù)器,且隊(duì)列進(jìn)行管理和調(diào)度。 你可以自定義選擇立即發(fā)送 或者 根據(jù)配置延遲發(fā)送
提高容錯(cuò)能力
在發(fā)送過(guò)程中,或許我們可能會(huì)遇到,目標(biāo)被拒絕。例如大多數(shù)人 會(huì)遇到給 admin@qq.comn
發(fā)送報(bào)錯(cuò) 502 的場(chǎng)景。
那這種場(chǎng)景,那么這種場(chǎng)景,我們可以理解其為是一個(gè)事件,在郵件發(fā)送的過(guò)程中,我們可以 引發(fā)構(gòu)建出如下幾種事件
通過(guò)此郵件發(fā)送,可能會(huì)導(dǎo)致多個(gè)耗時(shí)任務(wù)的產(chǎn)生,那我們其實(shí)也可以構(gòu)建出多個(gè) 隊(duì)列服務(wù)出來(lái)。每個(gè)隊(duì)列管理 自己的事情,很好的 解耦他們
通過(guò) Laravel 隊(duì)列 可以很好的進(jìn)行設(shè)置 立即發(fā)送、延遲發(fā)送、重試發(fā)送
發(fā)送失敗
郵件記錄入庫(kù)
代碼異常
郵件發(fā)送成功回調(diào)
發(fā)送失敗重試
發(fā)送頻率可控
使用過(guò)批量發(fā)送的郵件的 開(kāi)發(fā)者 必然會(huì)遇到一個(gè)問(wèn)題,那便是,如果我們直接進(jìn)行批量發(fā)送,即同一時(shí)間 進(jìn)行大量的郵件發(fā)送。那么郵件服務(wù)商很可能會(huì)把我們的郵件給拒絕 或者 郵件進(jìn)入垃圾箱,被識(shí)別為 廣告那么,這里便是用到了 延遲發(fā)送,我們可以根據(jù)當(dāng)前隊(duì)列服務(wù)中,已知的 正在等待 投遞的郵件,合理的配置頻率,或者 切換郵件配置,來(lái)達(dá)到,頻率可控。
如設(shè)置 一個(gè)配置一分鐘之類(lèi)發(fā)送10次,等等方案。 同樣,我們這里可以做到 配置、頻率控制、發(fā)送控制 解耦
其他
當(dāng)然 我們還有很多種情況都會(huì)用到
服務(wù)器端下載 excel
服務(wù)器端異步多任務(wù)處理 大數(shù)據(jù)
錯(cuò)誤消息處理
如何使用 Laravel 隊(duì)列
這里只是列出,大概的使用方向,和如何更好的去使用。代碼可能跑不起起來(lái),主要是理解 邏輯 我們這里 使用的是 redis 作為驅(qū)動(dòng)
驅(qū)動(dòng)設(shè)置為 Redis
> .env QUEUE_CONNECTION=redis > 在 config/queue.php 中可以找到
快速創(chuàng)建隊(duì)列 和 投遞任務(wù)
# 創(chuàng)建 任務(wù) php artisan make:job ProcessPodcast
自動(dòng)生成 app/Jobs/EmailJob.php
class EmailJob implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; protected $data; /** * Create a new job instance. * * @return void */ public function __construct(array $data) { $this->data = $data; } /** * Execute the job. * * @return void */ public function handle() { $service = new EmailService(); // ... 檢查當(dāng)前可用 Mailer // 這里你自定義就好了,這個(gè)方法中你可以根據(jù)你自己的配置,獲取到當(dāng)前可用的配置 $mailer = $service->getMailer(); // ... 獲取當(dāng)前要發(fā)送的數(shù)據(jù) $data = $this->data; $service->send($mailer, $data); } }
這些操作都能從 文檔中找到
調(diào)用 發(fā)送
# 延遲 2分鐘 發(fā)送 # 這里使用的是 Crontab 包 (不過(guò) Laravel 自帶) EmailJob::dispatch()->delay(now()->addMinutes(2)); # 立即發(fā)送 (不會(huì)進(jìn)入到隊(duì)列中) EmailJob::dispatchNow();
這里的隊(duì)列默認(rèn)用的 是 defult 隊(duì)列,我們可以修改為指定隊(duì)列服務(wù)
public function __construct(array $data) { # 使用 emailQueue $this->onQueue('emailQueue'); $this->data = $data; }
設(shè)置失敗情況下重試次數(shù)
# 重試 5 次 public $tries = 5;
設(shè)置超時(shí)時(shí)間
/** * 確定任務(wù)應(yīng)該超時(shí)的時(shí)間 * * @return \DateTime */ public function retryUntil() { return now()->addMinutes(10); }
啟動(dòng)我們的隊(duì)列
如果不配置 onQueue 的話,可以不帶 ---queue 參數(shù)配置
php artisan queue:work --queue=emailQueue
Laravel Event 也是通過(guò) 隊(duì)列實(shí)現(xiàn)的
# 創(chuàng)建 Event php artisan make:event FailEvent class FailEvent { use Dispatchable, InteractsWithSockets, SerializesModels; protected $data; protected $tag; /** * @param array $data 投遞的數(shù)據(jù) * @param string $tag 要操作的事情 */ public function __construct(array $data, string $tag = 'system') { $this->data = $data; $this->tag = $tag; } } # 創(chuàng)建 listener php artisan make:listener FailListener class FailListener { /** * Handle the event. * * @param object $event * @return void */ public function handle(FailEvent $event) { $this->{$event->tag}($event->data); } /** * 處理系統(tǒng)異常 * DateTime: 2021/12/3 11:02 上午 * @param array $data */ public function system(array $data) { } /** * 處理郵件異常 * DateTime: 2021/12/3 11:02 上午 */ public function email() { } } # app/Providers/EventServiceProvider.php protected $listen = [ FailEvent::class => [ FailListener::class, ], ] # 投遞 event(new FailEvent(['error' = '異常信息'], 'email'));
其實(shí),Laravel 大多數(shù)幫我實(shí)現(xiàn)了整個(gè)流程而已。可以嘗試自己使用 redis 來(lái)實(shí)現(xiàn)一個(gè)可控隊(duì)列。熟練是掌握 Redis 相關(guān)數(shù)據(jù)類(lèi)型即可. 這里簡(jiǎn)要列出 Redis 中,在以上模式中會(huì)用到的數(shù)據(jù)類(lèi)型
List
使用 它可以完成 出棧 入棧的 隊(duì)列功能
Hash
使用他 可以用來(lái)存儲(chǔ),序列化后的 Event或者 Job __construct傳入進(jìn)去的數(shù)據(jù),盡量不要將整個(gè) 類(lèi) 序列化進(jìn)去
也可以實(shí)現(xiàn)存儲(chǔ),Mailer 數(shù)據(jù)
Sorted Set
可以 設(shè)置時(shí)間為 Sorted Set中的分?jǐn)?shù),通過(guò)分?jǐn)?shù)排序,找到我們最近要執(zhí)行的隊(duì)列任務(wù)
當(dāng)然,Redis 的用法還有很多,滿足自己的需求即可。
世界上沒(méi)有完美的解決方案,只有最適合你自己的方案,在工作中遇到問(wèn)題,盡量要學(xué)會(huì)舉一反三,合理的運(yùn)用各種 工具,設(shè)計(jì)方案去實(shí)現(xiàn)。 代碼 只是最終一個(gè)縮影而已,最終的要學(xué)會(huì)理解,每個(gè)語(yǔ)言 每個(gè)框架,也只是一種方案的實(shí)現(xiàn),融會(huì)貫通才無(wú)敵 ...
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Laravel的隊(duì)列機(jī)制怎么用”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
文章題目:Laravel的隊(duì)列機(jī)制怎么用
路徑分享:http://www.rwnh.cn/article36/jdcgpg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、App開(kāi)發(fā)、關(guān)鍵詞優(yōu)化、企業(yè)建站、響應(yīng)式網(wǎng)站、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)