Redisは、キャッシュ、キューイング、メッセージの公開およびサブスクリプションシナリオで広く使用されているメモリベースの高性能キー価値データベースです。 PHP開発では、Redis Extensionの助けを借りて、Redisメッセージを継続的に聞くことができ、それにより公開されたメッセージにリアルタイムで応答して処理することができます。
Redis関数を使用する前に、Redis拡張機能がPHP環境にインストールされていることを確認してください。次のコマンドを使用して、PECLを介してインストールできます。
<span class="fun">peclインストールredis</span>
インストールが完了したら、php.ini構成ファイルに追加する必要があります。
<span class="fun">extension = redis.so</span>
構成を完了した後、PHPサービスを再起動し、Redis拡張機能を正常に使用します。
Redisは、それぞれサブスクライティングと公開メッセージにサブスクライブおよび公開コマンドを提供します。 PHPでは、 subscribeメソッドを呼び出すことにより、指定されたチャネルからメッセージを継続的にリッスンし、コールバック関数を介して受信したメッセージを処理できます。
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
$redis->subscribe(['channel'], function($redis, $channel, $message) {
// 受信したメッセージの処理
echo "Received message from channel {$channel}: {$message}\n";
});
上記のコードでは、Redisインスタンスを作成し、Redisサーバーに接続し、チャネルという名前のチャネルをサブスクライブし、Callback関数で受信したメッセージを印刷します。
シングルプロセスサブスクリプションモデルは、高い並行性シナリオのニーズを満たすことができません。マルチプロセステクノロジーを使用することにより、複数の消費者プロセスを開始でき、メッセージを同時に処理してシステムスループットを改善できます。
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
// 作成されたプロセスの数,需要に応じて調整します
$numWorkers = 4;
for ($i = 0; $i < $numWorkers; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die("Could not fork");
} elseif ($pid) {
// 親プロセス,次の子プロセスを作成し続けます
continue;
} else {
// サブプロセス,サブスクリプションとメッセージ処理ロジックを実行します
$redis->subscribe(['channel'], function($redis, $channel, $message) {
// 受信したメッセージの処理
echo "Received message from channel {$channel}: {$message}\n";
});
break;
}
}
// 等待サブプロセス退出
while (pcntl_waitpid(0, $status) != -1) {}
コードでは、複数のサブプロセスがPCNTL_FORK()を使用して作成され、それぞれが同時処理を実現するためにメッセージを個別にサブスクライブします。親プロセスは、子プロセスを作成し、それが終了するのを待つ責任があります。
Redis Extensionは非ブロッキングIOを採用し、マルチプロセスサブスクリプションが人種条件をトリガーする可能性があるため、特定のシナリオに基づいて合理的なロックメカニズムを実装して、プロセス間調整とデータセキュリティを確保することをお勧めします。
この記事では、PHPのRedis拡張を介してRedisメッセージサブスクリプションを継続的にリッスンし、マルチプロセステクノロジーを使用して、大量のメッセージを同時に効率的に処理する方法を紹介します。このソリューションは簡潔で実用的であるだけでなく、メッセージ処理のパフォーマンスを大幅に改善します。これは、リアルタイムの応答と大規模なメッセージ処理を必要とするアプリケーションシナリオに適しています。