這篇文章帶給大家的內容是關於laravel框架中隊列的用法介紹(附代碼) ,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
在實際的專案開發中,我們經常會遇到需要輕量級佇列的情形,例如發送簡訊、發送電子郵件等,這些任務不足以使用kafka、RabbitMQ 等重量級的訊息佇列,但是又的確需要非同步、重試、並發控制等功能。通常來說,我們經常使用 Redis、Beanstalk、Amazon SQS 來實現相關功能,laravel 為此對不同的後台隊列服務提供統一的 API,本文將會介紹應用最廣泛的 redis 隊列。
在講解 laravel 的隊列服務之前,我們要先說說基於 redis 的隊列服務。首先,redis設計用來做快取的,但由於它本身的某種特性使得它可以用來做訊息佇列
redis 佇列的資料結構
List 鍊錶
redis 做訊息佇列的特性例如FIFO(先入先出)很容易實現,只需要一個list 物件從頭取數據,從尾部塞資料即可。
相關的指令:(1)左側入右側出:lpush/rpop;(2)右側入左側出:rpush/lpop。
這個簡單的訊息佇列很容易實作。
Zset 有序集合
有些任務場景,並不需要任務立刻執行,而是需要延遲執行;有些任務很重要,需要在任務失敗的時候重新嘗試。這些功能僅僅依靠 list 是無法完成的。這個時候,就需要 redis 的有序集合。
Redis 有序集合和 Redis 集合類似,是不包含相同字串的集合。它們的差異是,每個有序集合的成員都關聯著一個評分 score,這個評分用於把有序集合中的成員按最低分到最高分排列。
單看有序集合和延遲任務並無關係,但是可以將有序集合的評分score 設定為延時任務開啟的時間,之後輪詢這個有序集合,將到期的任務拿出來處理,這樣就實現了延遲任務的功能。
對於重要的需要重試的任務,在任務執行之前,會將該任務放入有序集合中,設定任務最長的執行時間。若任務順利執行完畢,該任務會在有序集合中刪除。如果任務沒有在規定時間內完成,那麼該有序集合的任務將會被重新放入佇列中。
相關指令:
(1) ZADD 新增一個或多個成員到有序集合,或者如果它已經存在更新其分數。
(2) ZRANGEBYSCORE 按分數傳回一個成員範圍的有序集合。
(3) ZREMRANGEBYRANK 在給定的索引之內刪除所有成員的有序集合。
laravel 佇列服務的任務排程
佇列服務的任務排程過程如下:
laravel 的佇列服務由兩個進程控制,一個是生產者,一個是消費者。這兩個進程操縱了 redis 三個隊列,其中一個 List,負責即時任務,兩個 Zset,負責延時任務與待處理任務。
生產者負責向 redis 推送任務,如果是即時任務,預設就會向 queue:default 推送;如果是延時任務,就會向 queue:default:delayed 推送。
消費者輪詢兩個隊列,不斷的從隊列中取出任務,先把任務放入 queue:default:reserved 中,再執行相關任務。如果任務執行成功,就會刪除 queue:default:reserved 中的任務,否則會重新放入 queue:default:delayed 佇列中。
laravel 佇列服務的整體流程
任務分發流程:
任務處理器運作:
建立任務
queue 設定
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],
在config/queue.php中進行配置
一般來說,預設的redis 配置如上,connection 是database 中redis 的連接名稱;queue 是redis 中的隊列名稱,值得注意的是,如果使用的是redis 集群的話,這個需要使用key hash tag,也就是{default};當任務運行超過retry_after這個時間後,該任務會被重新放入隊列當中。
任務類別的建立
任務類別的結構很簡單,一般來說只會包含一個讓佇列用來呼叫此任務的 handle 方法。
如果想要使得任務被推送到佇列中,而不是同步執行,那麼就需要實作 IlluminateContractsQueueShouldQueue 介面。
如果想要讓任務推送到特定的連線中,例如 redis 或 sqs,那麼需要設定 conneciton 變數。
如果想要讓任務推送到特定的佇列中去,可以設定 queue 變數。
如果想要让任务延迟推送,那么需要设置 delay 变量。
如果想要设置任务至多重试的次数,可以使用 tries 变量;
如果想要设置任务可以运行的最大秒数,那么可以使用 timeout 参数。
如果想要手动访问队列,可以使用 trait : IlluminateQueueInteractsWithQueue。
任务的分发
分发服务
写好任务类后,就能通过 dispatch 辅助函数来分发它了。唯一需要传递给 dispatch 的参数是这个任务类的实例:
class PodcastController extends Controller { public function store(Request $request) { // 创建播客... ProcessPodcast::dispatch($podcast); } }
如果想延迟执行一个队列中的任务,可以用任务实例的 delay 方法。
ProcessPodcast::dispatch($podcast) ->delay(Carbon::now()->addMinutes(10));
通过推送任务到不同的队列,可以给队列任务分类,甚至可以控制给不同的队列分配多少任务。要指定队列的话,就调用任务实例的 onQueue 方法:
ProcessPodcast::dispatch($podcast)->onQueue('processing');
如果使用了多个队列连接,可以将任务推到指定连接。要指定连接的话,可以在分发任务的时候使用 onConnection 方法:
ProcessPodcast::dispatch($podcast)->onConnection('redis ');
以上是laravel框架中隊列的用法介紹(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Laravel的遷移系統在最新版本中提供了哪些新功能和最佳實踐? 1.新增了nullableMorphs()用於多態關係。 2.引入了after()方法來指定列順序。 3.強調處理外鍵約束以避免孤立記錄。 4.建議優化性能,如適當添加索引。 5.提倡遷移的冪等性和使用描述性名稱。

Laravel的最新版本引入了多個新功能:1.LaravelPennant用於管理功能標誌,允許分階段發布新功能;2.LaravelReverb簡化了實時功能的實現,如實時評論;3.LaravelVite加速了前端構建過程;4.新的模型工廠系統增強了測試數據的創建;5.改進了錯誤處理機制,提供了更靈活的錯誤頁面自定義選項。

SoftleteTeinElelelverisling -Memptry -BraceChortsDevetus -teedeeceteveveledeveveledeecetteecetecetecedelave

laravel10.xisthecurrentversion,offeringNewFeaturesLikeEnumSupportineloQuentModelsAndModersAndImpreverModeModeModelBindingWithenums.theSeupDatesEupDatesEnhanceCodereadability andSecurity andSecurity和butquirecareecarefulecarefulecarefulplanninganninganningalmplementAlimplemplemplemplemplemplempletationForupforupsupflade。

laravelmigrationsStreamLinedAtabasemangementbyallowingbolAlyChemachangeStobEdeDinedInphpcode,whobeversion-controllolleDandShared.here'showtousethem:1)createMigrationClassestodeFinePerationFineFineOperationsLikeCreatingingModifyingTables.2)

要查找最新版本的Laravel,可以訪問官方網站laravel.com並點擊右上角的"Docs"按鈕,或使用Composer命令"composershowlaravel/framework|grepversions"。保持更新有助於提升項目安全性和性能,但需考慮對現有項目的影響。

youshouldupdateTotheLateStlaravelVerverSionForPerformanceImprovements,增強的安全性,newfeatures,BetterCommunitySupport,and long-term-Maintenance.1)績效:Laravel9'Selover9'seloquentormoptimizatizationenenhanceApplicationsPeed.2)secuse:laravel8InIntrododeDodecter.2)


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

禪工作室 13.0.1
強大的PHP整合開發環境

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器