Laravelフレームワークでのキューの使い方の紹介(コード付き)
この記事では、laravel フレームワークでのキューの使用方法を紹介します (コード付き)。必要な方は参考にしていただければ幸いです。
実際のプロジェクト開発では、テキスト メッセージの送信や電子メールの送信など、軽量のキューが必要な状況によく遭遇します。これらのタスクは、kafka や RabbitMQ などの重量のあるメッセージ キューを使用するのに十分ではありませんが、非同期、再試行が必要です。 、同時実行制御およびその他の機能。一般に、関連する機能を実装するには、Redis、Beanstalk、Amazon SQS を使用することがよくあります。Laravel は、さまざまなバックグラウンド キュー サービスに統合された API を提供します。この記事では、最も広く使用されている Redis キューを紹介します。
laravelのキューサービスを説明する前に、まずredisベースのキューサービスについて話す必要があります。まず第一に、redis はキャッシュ用に設計されていますが、その独自の特性のいくつかにより、メッセージ キューにも使用できます
redis キュー データ構造
リスト リンク リスト
FIFO などのメッセージ キューの redis 機能 (最初に、 in-first-out) (out) は実装が簡単で、先頭からデータを取得し、末尾からデータを詰め込むためのリスト オブジェクトが必要なだけです。
関連コマンド: (1) 左インおよび右アウト: lpush/rpop; (2) 右インおよび左アウト: rpush/lpop。
このシンプルなメッセージキューは実装が簡単です。
Zset 順序セット
一部のタスク シナリオでは、タスクをすぐに実行する必要はありませんが、遅延する必要があるタスクもあります。タスクが失敗した場合は再試行する必要があります。これらの機能は、リストに依存するだけでは実現できません。現時点では、順序付けられた Redis のコレクションが必要です。
Redis 順序付きセットは Redis セットに似ており、同じ文字列を含まないコレクションです。それらの違いは、順序付きセットの各メンバーがスコアに関連付けられていることです。スコアは、順序付きセットのメンバーを最低スコアから最高スコアまでランク付けするために使用されます。
順序付きセットと遅延タスク単独の間には関係はありませんが、順序付きセットのスコアを遅延タスクの開始時刻に設定し、順序付きセットをポーリングして期限切れのタスクを処理用に取り出すことができます。このようにして、タスクを遅延させる機能が実現される。
再試行が必要な重要なタスクの場合、タスクが実行される前に、タスクは順序付きコレクションに入れられ、タスクの最長実行時間が設定されます。タスクが正常に実行されると、タスクは順序付けられたコレクションから削除されます。指定された時間内にタスクが完了しない場合、順序付きセット内のタスクはキューに戻されます。
関連コマンド:
(1) ZADD 順序付きセットに 1 つ以上のメンバーを追加するか、既に存在する場合はそのスコアを更新します。
(2) ZRANGEBYSCORE スコアによって順序付けられたメンバー範囲のセットを返します。
(3) ZREMRANGEBYRANK 指定されたインデックス内の順序付きセットからすべてのメンバーを削除します。
laravelキューサービスのタスクスケジューリング
キューサービスのタスクスケジューリングプロセスは次のとおりです:
laravelのキューサービスは2つのプロセスによって制御され、1つはプロデューサー、もう1つはコンシューマーです。これら 2 つのプロセスは 3 つの Redis キューを操作します。そのうちの 1 つは即時タスクを担当する List と、遅延タスクと保留中のタスクを担当する 2 つの Zset です。
プロデューサーは、タスクを Redis にプッシュする責任があります。即時タスクの場合は、デフォルトで queue:default にプッシュされます。遅延タスクの場合は、queue:default:layed にプッシュされます。
コンシューマーは 2 つのキューをポーリングし、キューからタスクを継続的に取り出し、まずタスクを queue:default:reserved に入れ、次に関連するタスクを実行します。タスクが正常に実行された場合、queue:default:reserved 内のタスクは削除され、そうでない場合は queue:default:layed キューに戻されます。
laravelキューサービスの全体の流れ
タスク分散処理:
タスクプロセッサの動作:
タスクの作成
キュー設定
'redis' => [ 'driver' => 'redis', 'connection' => 'default', 'queue' => 'default', 'retry_after' => 90, ],
config/queue.phpで設定
一般的に言えばデフォルトの redis 設定は上記のとおりです。 connection はデータベース内の redis の接続名です。redis クラスターを使用している場合は、キー ハッシュ タグを使用する必要があることに注意してください。 is, {default}; タスクが retry_after 時間を超えて実行されると、タスクはキューに戻されます。
タスククラスの作成
一般的に、タスククラスの構造は非常に単純で、キューがこのタスクを呼び出すために使用するハンドルメソッドのみが含まれています。
タスクを同期的に実行するのではなくキューにプッシュしたい場合は、IlluminateContractsQueueShouldQueue インターフェースを実装する必要があります。
Redis や sqs などの特定の接続にタスクをプッシュする場合は、connect 変数を設定する必要があります。
タスクを特定のキューにプッシュしたい場合は、キュー変数を設定できます。
如果想要让任务延迟推送,那么需要设置 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 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









PHPの将来は、新しいテクノロジーの傾向に適応し、革新的な機能を導入することで達成されます。1)クラウドコンピューティング、コンテナ化、マイクロサービスアーキテクチャに適応し、DockerとKubernetesをサポートします。 2)パフォーマンスとデータ処理の効率を改善するために、JITコンパイラと列挙タイプを導入します。 3)パフォーマンスを継続的に最適化し、ベストプラクティスを促進します。

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHPは、シンプルな構文と高い実行効率を備えたWeb開発に適しています。 2。Pythonは、簡潔な構文とリッチライブラリを備えたデータサイエンスと機械学習に適しています。

Redisクラスターモードは、シャードを介してRedisインスタンスを複数のサーバーに展開し、スケーラビリティと可用性を向上させます。構造の手順は次のとおりです。異なるポートで奇妙なRedisインスタンスを作成します。 3つのセンチネルインスタンスを作成し、Redisインスタンスを監視し、フェールオーバーを監視します。 Sentinel構成ファイルを構成し、Redisインスタンス情報とフェールオーバー設定の監視を追加します。 Redisインスタンス構成ファイルを構成し、クラスターモードを有効にし、クラスター情報ファイルパスを指定します。各Redisインスタンスの情報を含むnodes.confファイルを作成します。クラスターを起動し、CREATEコマンドを実行してクラスターを作成し、レプリカの数を指定します。クラスターにログインしてクラスター情報コマンドを実行して、クラスターステータスを確認します。作る

PHPは死にかけていませんが、常に適応して進化しています。 1)PHPは、1994年以来、新しいテクノロジーの傾向に適応するために複数のバージョンの反復を受けています。 2)現在、電子商取引、コンテンツ管理システム、その他の分野で広く使用されています。 3)PHP8は、パフォーマンスと近代化を改善するために、JITコンパイラおよびその他の機能を導入します。 4)Opcacheを使用してPSR-12標準に従って、パフォーマンスとコードの品質を最適化します。

Redis指令を使用するには、次の手順が必要です。Redisクライアントを開きます。コマンド(動詞キー値)を入力します。必要なパラメーターを提供します(指示ごとに異なります)。 Enterを押してコマンドを実行します。 Redisは、操作の結果を示す応答を返します(通常はOKまたは-ERR)。

Redisはハッシュテーブルを使用してデータを保存し、文字列、リスト、ハッシュテーブル、コレクション、注文コレクションなどのデータ構造をサポートします。 Redisは、スナップショット(RDB)を介してデータを維持し、書き込み専用(AOF)メカニズムを追加します。 Redisは、マスタースレーブレプリケーションを使用して、データの可用性を向上させます。 Redisは、シングルスレッドイベントループを使用して接続とコマンドを処理して、データの原子性と一貫性を確保します。 Redisは、キーの有効期限を設定し、怠zyな削除メカニズムを使用して有効期限キーを削除します。

Redisのすべてのキーを表示するには、3つの方法があります。キーコマンドを使用して、指定されたパターンに一致するすべてのキーを返します。スキャンコマンドを使用してキーを繰り返し、キーのセットを返します。情報コマンドを使用して、キーの総数を取得します。

Redisサーバーを起動する手順には、以下が含まれます。オペレーティングシステムに従ってRedisをインストールします。 Redis-Server(Linux/Macos)またはRedis-Server.exe(Windows)を介してRedisサービスを開始します。 Redis-Cli ping(Linux/macos)またはRedis-Cli.exePing(Windows)コマンドを使用して、サービスステータスを確認します。 Redis-Cli、Python、node.jsなどのRedisクライアントを使用して、サーバーにアクセスします。
