目錄
redis 佇列的資料結構
List 鍊錶
Zset 有序集合
laravel 佇列服務的任務排程
laravel 佇列服務的整體流程
建立任務
queue 設定
任務類別的建立
首頁 php框架 Laravel laravel框架中隊列的用法介紹(附程式碼)

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

Aug 28, 2018 pm 01:37 PM
laravel php redis

這篇文章帶給大家的內容是關於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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1675
14
CakePHP 教程
1429
52
Laravel 教程
1333
25
PHP教程
1278
29
C# 教程
1257
24
作曲家:通過AI的幫助開發PHP 作曲家:通過AI的幫助開發PHP Apr 29, 2025 am 12:27 AM

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

session_start()函數的意義是什麼? session_start()函數的意義是什麼? May 03, 2025 am 12:18 AM

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

php框架laravel和yii區別是什麼 php框架laravel和yii區別是什麼 Apr 30, 2025 pm 02:24 PM

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

H5:HTML5的關鍵改進 H5:HTML5的關鍵改進 Apr 28, 2025 am 12:26 AM

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

如何使用MySQL的函數進行數據處理和計算 如何使用MySQL的函數進行數據處理和計算 Apr 29, 2025 pm 04:21 PM

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

Laravel 最佳擴展包推薦:2024 年必備工具 Laravel 最佳擴展包推薦:2024 年必備工具 Apr 30, 2025 pm 02:18 PM

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

作曲家:PHP開發人員的軟件包經理 作曲家:PHP開發人員的軟件包經理 May 02, 2025 am 12:23 AM

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

Laravel 日誌與錯誤監控:Sentry 和 Bugsnag 集成 Laravel 日誌與錯誤監控:Sentry 和 Bugsnag 集成 Apr 30, 2025 pm 02:39 PM

在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監

See all articles