Laravel 實現 隊列 發送郵件功能

一. 什么是隊列

在構建 Web 應用程序時,你可能需要執行一些任務,例如解析文件,發送郵件,大量的數據計算等等,這些任務在典型的 Web 請求期間需要很長時間才能執行

慶幸的是,Laravel 可以創建在后臺運行的隊列任務。 通過將時間密集型任務移至隊列,你的應用程序可以以極快的速度響應 Web 請求,并為你的客戶提供更好的用戶體驗。

說人話:laravel可以輕松創建,后臺運行的隊列,再將耗時的任務移到隊列,減少用戶在頁面上的等待時間,提高用戶體驗。

二. 配置隊列驅動

隊列驅動 就是 以哪個方式來處理隊列任務。

常見的驅動如下:
在這里插入圖片描述

1.sync 驅動 (同步)

.env 文件 編輯

QUEUE_CONNECTION=sync

特點是: 任務立即執行,不進入隊列, 適合開發和測試環境,請求會阻塞直到任務完成

我一般是本地和測試使用,如果使用這個,那就跟隊列沒什么關系了,直接同步執行

2. database 驅動

QUEUE_CONNECTION=database

數據庫驅動時,肯定首先需要創建數據表的。用來存儲隊列服務的。如下

php artisan queue:table
php artisan migrate

會創建兩個表,存儲任務數據
在這里插入圖片描述
打開 config/queue.php 文件,配置一下

'database' => ['driver' => 'database','table' => 'jobs','queue' => 'default','retry_after' => 90,
],

特點是:使用的是數據庫存儲任務,不需要單獨配置服務,有數據庫即可,適合中小規模項目

3. redis 驅動 (推薦)

QUEUE_CONNECTION=redis

打開 config/queue.php 文件,配置一下

 'redis' => ['driver' => 'redis','connection' => 'default','queue' => env('REDIS_QUEUE', 'default'),'retry_after' => 90,'block_for' => null,'after_commit' => false,],

注意
利用 redis 做為驅動的話,前提一定要配置好 redis

特點:高性能適合生產環境支持隊列優先級

其他的驅動,暫時不做說明,大家可以自己去研究下。

三.創建隊列任務

1. 生成任務類

php artisan make:job ProjectJob

生成的文件位于 app/Jobs/ProjectJob.php

2.任務類開發邏輯

<?phpnamespace App\Jobs;use App\Http\Services\ProjectService;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Log;/*** 項目工程隊列*/
class ProjectJob implements ShouldQueue
{use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;public array $reqData;/*** 任務支持錯誤,可嘗試的次數。** @var int*/public $tries = 5;/*** Create a new job instance.*/public function __construct($data = []){$this->reqData = $data;$this->onQueue('project-compute');}/*** Execute the job.*/public function handle(): void{$data = $this->reqData;// 開始發送郵件功能,大量耗時的任務開始編碼Log::info("===project-compute-Log===", [$data, $res]);}}

3.唯一任務實現

有時,希望這個隊列在任務時間點,只有一個任務的實例,只需要實現 ShouldBeUnique 即可。

<?phpuse Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Contracts\Queue\ShouldBeUnique;class ProjectJob implements ShouldQueue, ShouldBeUnique
{public $Project;/*** 唯一鎖將被釋放的秒數** @var int*/public $uniqueFor = 20;/*** 任務的唯一 ID*/public function uniqueId(): string{return $this->Project->id;}
}

如上:同一個 Project->id 在 20 秒內,都會被忽略,當 20 秒后,相同的id任務會再次分配到隊列

四. 分發隊列任務

分發,也就是怎么在控制器里面 去 將任務 丟到隊列。

1.基本分發方式

ProjectJob ::dispatch(['data':"123"]);

2.延遲分發,10分鐘后

ProjectJob ::dispatch(['data':"123"])->delay(now()->addMinutes(10));;

3.同步分發,立即執行

ProjectJob ::dispatchSync(['data':"123"]);

4. 指定隊列

ProjectJob ::dispatch(['data':"123"])->onQueue('high');

五. 隊列工作進程管理

1. 啟動隊列工作進程

php artisan queue:work

在這里插入圖片描述

2. 常用選項

# 指定隊列連接
php artisan queue:work --queue=highphp artisan queue:work --queue=high,default

--queue=high,default 是啟動了一個工作進程,但該進程會按照優先級處理多個隊列中的任務

3. 重啟隊列

在隊列的代碼修改了,那么就需要重啟隊列。

php artisan queue:restart

由于隊列任務是長期存在的進程,如果不重新啟動,他們不會注意到代碼的更改。

可以通過發出 queue:restart 命令優雅地重新啟動所有進程

queue:restart 說明:
  1. 不是真正的進程重啟:

    • 不會終止或重新創建現有的隊列工作進程

    • 不會改變進程ID(PID)或端口

    • 現有進程會繼續完成當前正在處理的任務

  2. 優雅重啟機制:

    • 在存儲系統(緩存/數據庫)中設置重啟標記

    • 工作進程在完成當前任務后檢查到標記,會自行退出

    • 進程管理器(如Supervisor)會自動重新啟動新進程

注意

我的隊列進程就是 用 Supervisor 托管的,所以在 queue:restart 后,Supervisor 會自動重啟我的隊列進程。

在這里插入圖片描述
當前隊列進程啟動后,在控制器內,丟入任務到隊列,隊列就會排隊處理任務了。

如下圖所示,隊列的處理日志。
在這里插入圖片描述

六. 處理失敗的任務

在任務處理失敗時,隊列會先嘗試在運行幾次,見 2.任務類開發邏輯tries 參數,超過此嘗試次數后,它將被插入到 failed_jobs 數據庫表中

php artisan queue:failed-tablephp artisan migrate

可以使用 queue:failed-table 命令來創建遷移錯誤任務表

1.查看失敗任務

php artisan queue:failed

如圖:
在這里插入圖片描述

2. 重試失敗的任務

#重試單個任務id
php artisan queue:retry ce7bb17c-cdd8-41f0-a8ec-7b4fef4e5ece# 重試多個任務id
php artisan queue:retry ce7bb17c-cdd8-41f0-a8ec-7b4fef4e5ece 91401d2c-0784-4f43-824c-34f94a33c24d# 重試指定隊列的所有失敗任務
php artisan queue:retry --queue=name#重試所有失敗任務
php artisan queue:retry all

執行后

在這里插入圖片描述

3.清理失敗任務

#要刪除指定的失敗任務
php artisan queue:forget 91401d2c-0784-4f43-824c-34f94a33c24d# 刪除 failed_jobs 表中所有失敗任務
php artisan queue:flush

如圖
在這里插入圖片描述

通過以上配置和使用方法,你可以充分利用Laravel隊列系統來提高應用性能和用戶體驗。

在實際的使用中,會遇到各種問題,大家可以自行去拓展,里面有很多的參數設置和功能,我這邊就不一一去說明,邊用邊學。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76407.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76407.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76407.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

flink Shuffle的總結

關于 ** ?5 種 Shuffle 類型** 的區別、使用場景及 Flink 版本支持的總結&#xff1a; * 注意:下面是問AI具體細節與整理學習 1. 核心區別 Shuffle 類型核心特點使用場景Flink 版本支持Pipelined Shuffle流式調度&#xff0c;純內存交換&#xff0c;低延遲&#xff08;毫秒級…

Git使用與管理

一.基本操作 1.創建本地倉庫 在對應文件目錄下進行&#xff1a; git init 輸入完上面的代碼&#xff0c;所在文件目錄下就會多一個名為 .git 的隱藏文件&#xff0c;該文件是Git用來跟蹤和管理倉庫的。 我們可以使用 tree 命令&#xff08;注意要先下載tree插件&#xff09…

計算機視覺——深度學習圖像處理中目標檢測平均精度均值(mAP)與其他常用評估指標

概述 平均精度均值&#xff08;mAP&#xff09;是目標檢測領域中最為流行且復雜的重要評估指標之一。它廣泛用于綜合總結目標檢測器的性能。許多目標檢測模型會輸出類似以下的參數結果&#xff1a; Average Precision (AP) [ IoU0.50:0.95 | area all | maxDets100 ] 0.3…

C語言中單鏈表操作:查找節點與刪除節點

一. 簡介 前面學習了C語言中創建鏈表節點&#xff0c;向鏈表中插入節點等操作&#xff0c;文章如下&#xff1a; C語言中單向鏈表&#xff1a;創建節點與插入新節點-CSDN博客 本文繼續學習c語言中對鏈表的其他操作&#xff0c;例如在鏈表中查找某個節點&#xff0c;刪除鏈表…

WePY 框架:小程序開發的“Vue式”利器!!!

WePY 框架&#xff1a;小程序開發的“Vue式”利器 &#x1f680; 哈嘍&#xff0c;大家好&#xff01;&#x1f44b; 今天我們要聊聊一個在微信小程序開發中大放異彩的框架——WePY&#xff01;它是什么&#xff1f;有什么特點&#xff1f;為啥值得一試&#xff1f;別急&#…

什么是微前端?有什么好處?有哪一些方案?

微前端&#xff08;Micro Frontends&#xff09; 微前端是一種架構理念&#xff0c;借鑒了微服務的思想&#xff0c;將一個大型的前端應用拆分為多個獨立、自治的子應用&#xff0c;每個子應用可以由不同團隊、使用不同技術棧獨立開發和部署&#xff0c;最終聚合為一個整體產品…

【家政平臺開發(33)】庫存管理模塊開發實戰:從基礎搭建到智能管控

本【家政平臺開發】專欄聚焦家政平臺從 0 到 1 的全流程打造。從前期需求分析,剖析家政行業現狀、挖掘用戶需求與梳理功能要點,到系統設計階段的架構選型、數據庫構建,再到開發階段各模塊逐一實現。涵蓋移動與 PC 端設計、接口開發及性能優化,測試階段多維度保障平臺質量,…

Mysql個人筆記

Mysql個人筆記 sql基礎書寫規則和種類種類書寫規則注釋規則啟動 DDL數據類型數據庫的操作useshowcreatedrop 表的操作useshowcreate創建表復制表 dropalter Mysql的存儲引擎 DMLselectselect語句like&#xff08;謂詞&#xff09;where聚合函數&#xff1a;關于nullgroup byexi…

【重裝系統】大白菜自制U盤裝機,備份C盤數據,解決電腦啟動黑屏/藍屏

1. 準備 U 盤 U 盤容量至少 8G&#xff0c;備份 U 盤的數據&#xff08;后期會格式化&#xff09; 2. 從微軟官網下載操作系統鏡像 https://www.microsoft.com/zh-cn/software-download/windows11 3. 下載安裝大白菜 https://www.alipan.com/s/33RVnKayUfY 4. 插入 U 盤&#…

各類神經網絡學習:(十)注意力機制(第2/4集),pytorch 中的多維注意力機制、自注意力機制、掩碼自注意力機制、多頭注意力機制

上一篇下一篇注意力機制&#xff08;第1/4集&#xff09;待編寫 一、pytorch 中的多維注意力機制&#xff1a; 在 N L P NLP NLP 領域內&#xff0c;上述三個參數都是 向量 &#xff0c; 在 p y t o r c h pytorch pytorch 中參數向量會組成 矩陣 &#xff0c;方便代碼編寫。…

uni-app初學

文章目錄 1. pages.json 頁面路由2. 圖標3. 全局 CSS4. 首頁4.1 整體框架4.2 完整代碼4.3 輪播圖 swiper4.3.1 image 4.4 公告4.4.1 uni-icons 4.5 分類 uni-row、uni-col4.6 商品列表 小程序開發網址&#xff1a; 注冊小程序賬號 微信開發者工具下載 uniapp 官網 HbuilderX 下…

VBA將Word文檔內容逐行寫入Excel

如果你需要將Word文檔的內容導入Excel工作表來進行數據加工&#xff0c;使用下面的代碼可以實現&#xff1a; Sub ImportWordToExcel()Dim wordApp As Word.ApplicationDim wordDoc As Word.DocumentDim excelSheet As WorksheetDim filePath As VariantDim i As LongDim para…

MySQL運行一段時間后磁盤出現100%讀寫

MySQL運行一段時間后磁盤出現100%讀寫的情況&#xff0c;可能是由多種原因導致的&#xff0c;以下是一些常見原因及解決方法&#xff1a; 可能的原因 1. 磁盤I/O壓力過大[^0^]&#xff1a;數據量過大&#xff0c;數據庫查詢和寫入操作消耗大量I/O資源。索引效率低&#xff0c…

【RabbitMQ】延遲隊列

1.概述 延遲隊列其實就是隊列里的消息是希望在指定時間到了以后或之前取出和處理&#xff0c;簡單來說&#xff0c;延時隊列就是用來存放需要在指定時間被處理的元素的隊列。 延時隊列的使用場景&#xff1a; 1.訂單在十分鐘之內未支付則自動取消 2.新創建的店鋪&#xff0c;…

Linux筆記之Ubuntu系統設置自動登錄tty1界面

Ubuntu22.04系統 編輯getty配置文件 vim /etc/systemd/system/gettytty1.service.d/override.conf如果該目錄或者文件不存在&#xff0c;進行創建。 在override.conf文件中進行編輯&#xff1a; [Service] ExecStart ExecStart-/sbin/agetty --autologin yourusername --no…

C++程序詩篇的靈動賦形:多態

文章目錄 1.什么是多態&#xff1f;2.多態的語法實現2.1 虛函數2.2 多態的構成2.3 虛函數的重寫2.3.1 協變2.3.2 析構函數的重寫 2.4 override 和 final 3.抽象類4.多態原理4.1 虛函數表4.2 多態原理實現4.3 動態綁定與靜態綁定 5.繼承和多態常見的面試問題希望讀者們多多三連支…

算法訓練之動態規劃(三)

???~~~~~~歡迎光臨知星小度博客空間~~~~~~??? ???零星地變得優秀~也能拼湊出星河~??? ???我們一起努力成為更好的自己~??? ???如果這一篇博客對你有幫助~別忘了點贊分享哦~??? ???如果有什么問題可以評論區留言或者私信我哦~??? ?????? 個…

$_GET變量

$_GET 是一個超級全局變量&#xff0c;在 PHP 中用于收集通過 URL 查詢字符串傳遞的參數。它是一個關聯數組&#xff0c;包含了所有通過 HTTP GET 方法發送到當前腳本的變量。 預定義的 $_GET 變量用于收集來自 method"get" 的表單中的值。 從帶有 GET 方法的表單發…

jQuery多庫共存

在現代Web開發中&#xff0c;項目往往需要集成多種JavaScript庫或框架來滿足不同的功能需求。然而&#xff0c;當多個庫同時使用時&#xff0c;可能會出現命名沖突、功能覆蓋等問題。幸運的是&#xff0c;jQuery提供了一些機制來確保其可以與其他庫和諧共存。本文將探討如何實現…

MySQL 中的聚簇索引和非聚簇索引有什么區別?

MySQL 中的聚簇索引和非聚簇索引有什么區別&#xff1f; 1. 從不同存儲引擎去考慮 在MySIAM存儲引擎中&#xff0c;索引和數據是分開存儲的&#xff0c;包括主鍵索引在內的所有索引都是“非聚簇”的&#xff0c;每個索引的葉子節點存儲的是數據記錄的物理地址&#xff08;指針…