ホームページ  >  記事  >  PHPフレームワーク  >  Laravel のキューのメカニズムについて説明し、キューの使用シナリオを理解しましょう。

Laravel のキューのメカニズムについて説明し、キューの使用シナリオを理解しましょう。

青灯夜游
青灯夜游転載
2021-12-20 16:52:492582ブラウズ

Laravelキューの使い方は?以下の Laravel チュートリアル コラムでは、Laravel キューの使用方法と、キューを使用するシナリオを紹介します。

Laravel のキューのメカニズムについて説明し、キューの使用シナリオを理解しましょう。

なぜですか?

まず、なぜキューを使用する必要があるのか​​、キューを使用すると何が起こるのかを知る必要があります。キューは使わないでください!利点と欠点は何ですか。

簡単なシナリオの例をいくつか挙げます。

#メールの送信

メール送信時に直面する一般的な問題は何ですか ??

    送信が遅い
  • 送信に失敗しました
  • ##送信頻度が高すぎるため、サービスプロバイダーによって拒否されるか、ゴミ箱に入ります
  • キューを使用する利点は何ですか?

クライアントの応答を向上させる
  • 送信時に、すぐに処理せず、キューにスローします。サーバーに接続され、キューが管理およびスケジュールされます。構成に応じて、すぐに送信するか、送信を遅らせるかのオプションをカスタマイズできます。

    フォールト トレランスの向上
  • 送信プロセス中に、ターゲットが拒否される場合があります。たとえば、ほとんどの人はエラー 502 を

    admin@qq.comn

    に送信するシナリオに遭遇するでしょう。 このシナリオでは、このシナリオをイベントとして理解できます。電子メール送信のプロセス中に、次のイベントをトリガーして構築できます

    ##送信失敗

    電子メール レコード ストレージ
    • コード例外
    • メール送信が成功した場合のコールバック
    • 送信が失敗した場合は再試行
    • このメールを介して送信すると、時間のかかる複数のメッセージが生成される可能性があります。タスクを実行するだけで、実際には複数の
    • キュー サービス
    • を構築できます。各キューは独自の処理を管理します。非常に優れています
    分離

    それらはLaravelキューを通じて非常にうまく設定できます即時送信

    遅延送信

    送信の再試行送信頻度は制御可能

  • バッチで送信された電子メールを使用していた開発者は、必然的に問題に遭遇します。バッチで送信する、つまり、同時に大量の電子メールを送信します。その場合、電子メール サービス プロバイダーが私たちの電子メールを拒否するか、
  • 電子メールがゴミ箱に入れられる可能性が高く、

    広告

    として識別されるため、ここでは

    遅延送信 が使用されます。 、現在のキュー サービスで配信を待っている既知のメールに応じて頻度を合理的に設定したり、メールの設定を切り替えて制御可能な頻度を実現したりできます。 1分間に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);
    }
}

いくつかの一般的な操作

これらの操作はドキュメントにあります。

Call to send

# 延迟 2分钟 发送
# 这里使用的是 Crontab 包 (不过 Laravel 自带)
EmailJob::dispatch()->delay(now()->addMinutes(2));

# 立即发送 (不会进入到队列中)
EmailJob::dispatchNow();
ここのキューはデフォルトでデフォルトのキューを使用しており、次のように変更できます。キュー サービスを指定します

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

イベントと結合して分離することができます

Laravel イベントもqueue を介して実装されました

# 创建 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'));
Others

実際、Laravel はプロセス全体の実装をほぼ支援してくれました。 Redis を使用して、制御可能なキューを自分で実装してみることができます。 Redis 関連のデータ型をマスターするために必要なのは、習熟度だけです。 上記のモードで Redis で使用されるデータ型の簡単なリストを次に示します。

List

これを使用して、スタックへのポップとプッシュのキュー機能を完了します

  • Hash

    渡されたシリアル化された

    Event

    または
  • Job
  • __construct

    を保存するために使用します。データ、クラス全体をシリアル化しないようにしてください

    ストレージを実装することもできます。メーラー データSorted Set

    時刻を # に設定できます。 ##Sorted Set

    スコアで並べ替えて、最近実行したいキュー タスクを見つけます

  • もちろん、独自のニーズを満たすための Redis の使用法は他にもたくさんあります。 。

    世界には完璧な解決策はなく、あなたにとって最適な解決策しかありません。仕事で問題に遭遇したときは、1 つの例から推論を導き、さまざまなツールを合理的に使用し、実装するための解決策を設計する方法を学ぶようにしてください。彼ら。 コードは最後の小宇宙にすぎません。最後に理解できるようになることです。各言語と各フレームワークはソリューションの実装にすぎません。それをマスターすることによってのみ無敵になれます...

    プログラミング関連の知識について詳しくは、プログラミング入門をご覧ください。 !

以上がLaravel のキューのメカニズムについて説明し、キューの使用シナリオを理解しましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjuejin.cnで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。