laravel框架中隊列的用法介紹(附程式碼)
這篇文章帶給大家的內容是關於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中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

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

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

AI可以幫助優化Composer的使用,具體方法包括:1.依賴管理優化:AI分析依賴關係,建議最佳版本組合,減少衝突。 2.自動化代碼生成:AI生成符合最佳實踐的composer.json文件。 3.代碼質量提升:AI檢測潛在問題,提供優化建議,提高代碼質量。這些方法通過機器學習和自然語言處理技術實現,幫助開發者提高效率和代碼質量。

session_start()iscucialinphpformanagingusersessions.1)ItInitiateSanewsessionifnoneexists,2)resumesanexistingsessions,and3)setsasesessionCookieforContinuityActinuityAccontinuityAcconActInityAcconActInityAcconAccRequests,EnablingApplicationsApplicationsLikeUseAppericationLikeUseAthenticationalticationaltication and PersersonalizedContentent。

Laravel和Yii的主要區別在於設計理念、功能特性和使用場景。 1.Laravel注重開發的簡潔和愉悅,提供豐富的功能如EloquentORM和Artisan工具,適合快速開發和初學者。 2.Yii強調性能和效率,適用於高負載應用,提供高效的ActiveRecord和緩存系統,但學習曲線較陡。

HTML5帶來了五個關鍵改進:1.語義化標籤提升了代碼清晰度和SEO效果;2.多媒體支持簡化了視頻和音頻嵌入;3.表單增強簡化了驗證;4.離線與本地存儲提高了用戶體驗;5.畫布與圖形功能增強了網頁的可視化效果。

MySQL函數可用於數據處理和計算。 1.基本用法包括字符串處理、日期計算和數學運算。 2.高級用法涉及結合多個函數實現複雜操作。 3.性能優化需避免在WHERE子句中使用函數,並使用GROUPBY和臨時表。

2024年必備的Laravel擴展包包括:1.LaravelDebugbar,用於監控和調試代碼;2.LaravelTelescope,提供詳細的應用監控;3.LaravelHorizon,管理Redis隊列任務。這些擴展包能提升開發效率和應用性能。

Composer是PHP的依賴管理工具,通過composer.json文件管理項目依賴。 1)解析composer.json獲取依賴信息;2)解析依賴關係形成依賴樹;3)從Packagist下載並安裝依賴到vendor目錄;4)生成composer.lock文件鎖定依賴版本,確保團隊一致性和項目可維護性。

在Laravel中集成Sentry和Bugsnag可以提高應用的穩定性和性能。 1.在composer.json中添加SentrySDK。 2.在config/app.php中添加Sentry服務提供者。 3.在.env文件中配置SentryDSN。 4.在App\Exceptions\Handler.php中添加Sentry錯誤報告。 5.使用Sentry捕獲並報告異常,並添加額外上下文信息。 6.在App\Exceptions\Handler.php中添加Bugsnag錯誤報告。 7.使用Bugsnag監
