この記事では、laravel フレームワークでのキューの使用方法を紹介します (コード付き)。必要な方は参考にしていただければ幸いです。
実際のプロジェクト開発では、テキスト メッセージの送信や電子メールの送信など、軽量のキューが必要な状況によく遭遇します。これらのタスクは、kafka や RabbitMQ などの重量のあるメッセージ キューを使用するのに十分ではありませんが、非同期、再試行が必要です。 、同時実行制御およびその他の機能。一般に、関連する機能を実装するには、Redis、Beanstalk、Amazon SQS を使用することがよくあります。Laravel は、さまざまなバックグラウンド キュー サービスに統合された API を提供します。この記事では、最も広く使用されている Redis キューを紹介します。
laravelのキューサービスを説明する前に、まずredisベースのキューサービスについて話す必要があります。まず第一に、redis はキャッシュ用に設計されていますが、その独自の特性のいくつかにより、メッセージ キューにも使用できます
FIFO などのメッセージ キューの redis 機能 (最初に、 in-first-out) (out) は実装が簡単で、先頭からデータを取得し、末尾からデータを詰め込むためのリスト オブジェクトが必要なだけです。
関連コマンド: (1) 左インおよび右アウト: lpush/rpop; (2) 右インおよび左アウト: rpush/lpop。
このシンプルなメッセージキューは実装が簡単です。
一部のタスク シナリオでは、タスクをすぐに実行する必要はありませんが、遅延する必要があるタスクもあります。タスクが失敗した場合は再試行する必要があります。これらの機能は、リストに依存するだけでは実現できません。現時点では、順序付けられた Redis のコレクションが必要です。
Redis 順序付きセットは Redis セットに似ており、同じ文字列を含まないコレクションです。それらの違いは、順序付きセットの各メンバーがスコアに関連付けられていることです。スコアは、順序付きセットのメンバーを最低スコアから最高スコアまでランク付けするために使用されます。
順序付きセットと遅延タスク単独の間には関係はありませんが、順序付きセットのスコアを遅延タスクの開始時刻に設定し、順序付きセットをポーリングして期限切れのタスクを処理用に取り出すことができます。このようにして、タスクを遅延させる機能が実現される。
再試行が必要な重要なタスクの場合、タスクが実行される前に、タスクは順序付きコレクションに入れられ、タスクの最長実行時間が設定されます。タスクが正常に実行されると、タスクは順序付けられたコレクションから削除されます。指定された時間内にタスクが完了しない場合、順序付きセット内のタスクはキューに戻されます。
関連コマンド:
(1) ZADD 順序付きセットに 1 つ以上のメンバーを追加するか、既に存在する場合はそのスコアを更新します。
(2) ZRANGEBYSCORE スコアによって順序付けられたメンバー範囲のセットを返します。
(3) ZREMRANGEBYRANK 指定されたインデックス内の順序付きセットからすべてのメンバーを削除します。
キューサービスのタスクスケジューリングプロセスは次のとおりです:
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 キューに戻されます。
タスク分散処理:
タスクプロセッサの動作:
'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 サイトの他の関連記事を参照してください。