搜尋
首頁php框架Laravellaravel框架中隊列的用法介紹(附程式碼)

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

laravel 的佇列服務由兩個進程控制,一個是生產者,一個是消費者。這兩個進程操縱了 redis 三個隊列,其中一個 List,負責即時任務,兩個 Zset,負責延時任務與待處理任務。

生產者負責向 redis 推送任務,如果是即時任務,預設就會向 queue:default 推送;如果是延時任務,就會向 queue:default:delayed 推送。

消費者輪詢兩個隊列,不斷的從隊列中取出任務,先把任務放入 queue:default:reserved 中,再執行相關任務。如果任務執行成功,就會刪除 queue:default:reserved 中的任務,否則會重新放入 queue:default:delayed 佇列中。

laravel 佇列服務的整體流程

任務分發流程:

laravel框架中隊列的用法介紹(附程式碼)

任務處理器運作:

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中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
行動中的Laravel:現實世界的應用和示例行動中的Laravel:現實世界的應用和示例Apr 16, 2025 am 12:02 AM

laravelcanbeeffectefection ininreal-worldapplications forbuildingscalablewebsolutions.1)ITSImplifieCrudoperationsInrestfulaPisusingEloquentorm.2)laravel'secosystem,包括Toolslikenova,包括Toolslikenova,增強功能

Laravel的主要功能:後端開發Laravel的主要功能:後端開發Apr 15, 2025 am 12:14 AM

Laravel在後端開發中的核心功能包括路由系統、EloquentORM、遷移功能、緩存系統和隊列系統。 1.路由系統簡化了URL映射,提高了代碼組織和維護性。 2.EloquentORM提供了面向對象的數據操作,提升了開發效率。 3.遷移功能通過版本控制管理數據庫結構,確保一致性。 4.緩存系統減少數據庫查詢,提升響應速度。 5.隊列系統有效處理大規模數據,避免阻塞用戶請求,提升整體性能。

Laravel的後端功能:數據庫,邏輯等等Laravel的後端功能:數據庫,邏輯等等Apr 14, 2025 am 12:04 AM

Laravel在後端開發中表現強大,通過EloquentORM簡化數據庫操作,控制器和服務類處理業務邏輯,並提供隊列、事件等功能。 1)EloquentORM通過模型映射數據庫表,簡化查詢。 2)業務邏輯在控制器和服務類中處理,提高模塊化和可維護性。 3)其他功能如隊列系統幫助處理複雜需求。

Laravel的多功能性:從簡單站點到復雜系統Laravel的多功能性:從簡單站點到復雜系統Apr 13, 2025 am 12:13 AM

選擇Laravel開發項目是因為其靈活性和強大功能適應不同規模和復雜度的需求。 Laravel提供路由系統、EloquentORM、Artisan命令行等功能,支持從簡單博客到復雜企業級系統的開發。

Laravel(PHP)與Python:開發環境和生態系統Laravel(PHP)與Python:開發環境和生態系統Apr 12, 2025 am 12:10 AM

Laravel和Python在開發環境和生態系統上的對比如下:1.Laravel的開發環境簡單,僅需PHP和Composer,提供了豐富的擴展包如LaravelForge,但擴展包維護可能不及時。 2.Python的開發環境也簡單,僅需Python和pip,生態系統龐大,涵蓋多個領域,但版本和依賴管理可能複雜。

Laravel和後端:為Web應用程序提供動力邏輯Laravel和後端:為Web應用程序提供動力邏輯Apr 11, 2025 am 11:29 AM

Laravel是如何在後端邏輯中發揮作用的?它通過路由系統、EloquentORM、認證與授權、事件與監聽器以及性能優化來簡化和增強後端開發。 1.路由系統允許定義URL結構和請求處理邏輯。 2.EloquentORM簡化數據庫交互。 3.認證與授權系統便於用戶管理。 4.事件與監聽器實現松耦合代碼結構。 5.性能優化通過緩存和隊列提高應用效率。

為什麼Laravel如此受歡迎?為什麼Laravel如此受歡迎?Apr 02, 2025 pm 02:16 PM

Laravel受歡迎的原因包括其簡化開發過程、提供愉快的開發環境和豐富的功能。 1)它吸收了RubyonRails的設計理念,結合PHP的靈活性。 2)提供瞭如EloquentORM、Blade模板引擎等工具,提高開發效率。 3)其MVC架構和依賴注入機制使代碼更加模塊化和可測試。 4)提供了強大的調試工具和性能優化方法,如緩存系統和最佳實踐。

django或laravel哪個更好?django或laravel哪個更好?Mar 28, 2025 am 10:41 AM

Django和Laravel都是全棧框架,Django適合Python開發者和復雜業務邏輯,Laravel適合PHP開發者和優雅語法。 1.Django基於Python,遵循“電池齊全”哲學,適合快速開發和高並發。 2.Laravel基於PHP,強調開發者體驗,適合小型到中型項目。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具