亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Laravel的隊列機制怎么用

發布時間:2021-12-20 17:05:04 來源:億速云 閱讀:153 作者:小新 欄目:編程語言

這篇文章主要介紹了Laravel的隊列機制怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

為什么 ?

首先,我們要知道為什么要使用隊列,不使用隊列會怎么樣!優缺點如何

我們可以舉例 幾個簡單場景。

郵件發送

郵件發送一般會面臨哪些問題 ??

  • 發送緩慢

  • 發送失敗

  • 發送頻率過高,被服務商拒絕 又或者 被進入垃圾箱

使用隊列的好處在與哪里

  • 提高客戶端響應

    當發送時,我們不要立即處理,而是丟給服務器,且隊列進行管理和調度。 你可以自定義選擇立即發送 或者 根據配置延遲發送

  • 提高容錯能力

    在發送過程中,或許我們可能會遇到,目標被拒絕。例如大多數人 會遇到給 admin@qq.comn 發送報錯 502 的場景。 那這種場景,那么這種場景,我們可以理解其為是一個事件,在郵件發送的過程中,我們可以 引發構建出如下幾種事件

    通過此郵件發送,可能會導致多個耗時任務的產生,那我們其實也可以構建出多個 隊列服務 出來。每個隊列管理 自己的事情,很好的 解耦 他們

    通過 Laravel 隊列 可以很好的進行設置 立即發送延遲發送重試發送

    • 發送失敗

    • 郵件記錄入庫

    • 代碼異常

    • 郵件發送成功回調

    • 發送失敗重試

  • 發送頻率可控

    使用過批量發送的郵件的 開發者 必然會遇到一個問題,那便是,如果我們直接進行批量發送,即同一時間 進行大量的郵件發送。那么郵件服務商很可能會把我們的郵件給拒絕 或者 郵件進入垃圾箱,被識別為 廣告那么,這里便是用到了 延遲發送,我們可以根據當前隊列服務中,已知的 正在等待 投遞的郵件,合理的配置頻率,或者 切換郵件配置,來達到,頻率可控。

    如設置 一個配置一分鐘之類發送10次,等等方案。 同樣,我們這里可以做到 配置、頻率控制、發送控制 解耦

其他

當然 我們還有很多種情況都會用到

  • 服務器端下載 excel

  • 服務器端異步多任務處理 大數據

  • 錯誤消息處理

如何使用 Laravel 隊列

這里只是列出,大概的使用方向,和如何更好的去使用。代碼可能跑不起起來,主要是理解 邏輯 我們這里 使用的是 Redis 作為驅動

驅動設置為 Redis

> .env
QUEUE_CONNECTION=redis
> 在 config/queue.php 中可以找到

快速創建隊列 和 投遞任務

# 創建 任務
php artisan make:job ProcessPodcast

自動生成 app/Jobs/EmailJob.php

class EmailJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    protected $data;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(array $data)
    {
        $this->data = $data;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        $service = new EmailService();

        // ... 檢查當前可用 Mailer
        // 這里你自定義就好了,這個方法中你可以根據你自己的配置,獲取到當前可用的配置
        $mailer = $service->getMailer();

        // ... 獲取當前要發送的數據
        $data = $this->data;
        
        $service->send($mailer, $data);
    }
}

一些常用操作

這些操作都能從 文檔中找到

調用 發送

# 延遲 2分鐘 發送
# 這里使用的是 Crontab 包 (不過 Laravel 自帶)
EmailJob::dispatch()->delay(now()->addMinutes(2));

# 立即發送 (不會進入到隊列中)
EmailJob::dispatchNow();

這里的隊列默認用的 是 defult 隊列,我們可以修改為指定隊列服務

public function __construct(array $data)
{
    # 使用 emailQueue
    $this->onQueue('emailQueue');
    $this->data = $data;
}

設置失敗情況下重試次數

# 重試 5 次
public $tries = 5;

設置超時時間

/**
* 確定任務應該超時的時間
*
* @return \DateTime
*/
public function retryUntil()
{
    return now()->addMinutes(10);
}

啟動我們的隊列

如果不配置 onQueue 的話,可以不帶 ---queue 參數配置

php artisan queue:work --queue=emailQueue

結合 Events 來解耦

Laravel Event 也是通過 隊列實現的

# 創建 Event
php artisan make:event FailEvent

class FailEvent
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    protected $data;
    protected $tag;

    /**
     * @param array $data 投遞的數據
     * @param string $tag 要操作的事情
     */
    public function __construct(array $data, string $tag = 'system')
    {
        $this->data = $data;
        $this->tag = $tag;
    }
}

# 創建 listener 
php artisan make:listener FailListener
class FailListener
{
    /**
    * Handle the event.
    * 
    * @param  object  $event
    * @return void
    */
    public function handle(FailEvent $event)
    {
        $this->{$event->tag}($event->data);
    }

    /**
     * 處理系統異常
     * DateTime: 2021/12/3 11:02 上午
     * @param array $data
     */
    public function system(array $data)
    {

    }

    /**
    * 處理郵件異常
    * DateTime: 2021/12/3 11:02 上午
    */
    public function email()
    {
    
    }

}

# app/Providers/EventServiceProvider.php
protected $listen = [
    FailEvent::class => [
        FailListener::class,
    ],
]

# 投遞
event(new FailEvent(['error' = '異常信息'], 'email'));

其他

其實,Laravel 大多數幫我實現了整個流程而已。可以嘗試自己使用 redis 來實現一個可控隊列。熟練是掌握 Redis 相關數據類型即可. 這里簡要列出 Redis 中,在以上模式中會用到的數據類型

  • List

    使用 它可以完成 出棧 入棧的 隊列功能

  • Hash

    使用他 可以用來存儲,序列化后的 Event 或者 Job  __construct 傳入進去的數據,盡量不要將整個 類 序列化進去

    也可以實現存儲,Mailer 數據

  • Sorted Set

    可以 設置時間為 Sorted Set 中的分數,通過分數排序,找到我們最近要執行的隊列任務

當然,Redis 的用法還有很多,滿足自己的需求即可。

世界上沒有完美的解決方案,只有最適合你自己的方案,在工作中遇到問題,盡量要學會舉一反三,合理的運用各種 工具,設計方案去實現。 代碼 只是最終一個縮影而已,最終的要學會理解,每個語言 每個框架,也只是一種方案的實現,融會貫通才無敵 ...

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Laravel的隊列機制怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

依安县| 景东| 鹤壁市| 明溪县| 新源县| 肥乡县| 海兴县| 镇赉县| 望江县| 保德县| 墨竹工卡县| 通城县| 灯塔市| 尼勒克县| 牟定县| 巢湖市| 邳州市| 迭部县| 封开县| 印江| 滁州市| 文山县| 财经| 永定县| 邓州市| 射洪县| 左贡县| 阳城县| 瑞昌市| 龙门县| 济南市| 汝南县| 大余县| 瓦房店市| 顺平县| 健康| 成都市| 惠东县| 通化县| 孟连| 长乐市|