ホームページ  >  記事  >  バックエンド開発  >  PHP を使用して Redis メッセージ サブスクリプションを継続的にリッスンし、複数のサーバーからのメッセージを処理するにはどうすればよいですか?

PHP を使用して Redis メッセージ サブスクリプションを継続的にリッスンし、複数のサーバーからのメッセージを処理するにはどうすればよいですか?

WBOY
WBOYオリジナル
2023-09-05 12:45:33785ブラウズ

PHP を使用して Redis メッセージ サブスクリプションを継続的にリッスンし、複数のサーバーからのメッセージを処理するにはどうすればよいですか?

PHP を使用して Redis メッセージ サブスクリプションを継続的に監視し、複数のサーバーからのメッセージを処理する方法

インターネット アプリケーションの継続的な開発により、リアルタイムのメッセージ プッシュが重要になってきました。多くの用途に必要です。高性能キャッシュ データベースとして、Redis のパブリッシュ/サブスクライブ モデルはこの需要を十分に満たすことができます。この記事では、PHP を使用して Redis メッセージをサブスクライブおよび処理し、複数のサーバーが同時にメッセージをリッスンする問題を解決する方法を紹介します。

まず、Redis データベースと PHP の Redis 拡張機能がインストールされ、正しく構成されていることを確認する必要があります。 Redis および Redis 拡張機能がインストールされていない場合は、関連ドキュメントを参照してインストールできます。

次に、単純なチャット ルーム アプリケーションを例として、PHP を使用して Redis メッセージ サブスクリプションを継続的に監視し、複数のサーバーからのメッセージを処理する方法を示します。

  1. Redis メッセージをサブスクライブするための subscriber.php という名前の PHP ファイルを作成します。
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->subscribe(['chat-room'], 'processMessage'); // 订阅名为chat-room的频道,并指定回调函数processMessage

function processMessage($redis, $channel, $message)
{
    // 处理接收到的消息,例如将消息推送给聊天室的在线用户
    echo "Received message from channel {$channel}: {$message}
";
    // 在这里实现将消息推送给聊天室的在线用户的逻辑
}
  1. メッセージを Redis にパブリッシュするための publisher.php という名前の PHP ファイルを作成します。
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->publish('chat-room', 'Hello, world!'); // 向名为chat-room的频道发布一条消息

上記のコードを通じて、単純な Redis メッセージのサブスクリプションおよび公開機能を実装しました。 subscriber.php を実行して Redis メッセージをリッスンし、publisher.php を実行してメッセージを Redis にパブリッシュできます。メッセージが受信されると、processMessage コールバック関数が呼び出され、この関数にメッセージ処理ロジックを実装できます。

ただし、複数のサーバーを使用してメッセージを処理し、各サーバーがsubscriber.phpを実行してRedisメッセージを継続的に監視する場合、メッセージは複数回処理され、操作が繰り返されることになります。

この問題を解決するには、Redis の PUBLISH/SUBSCRIBE 機能を使用します。 Redis メッセージをサブスクライブし、メッセージを処理するロジックを他のサーバーに転送するための追加サーバーを作成できます。以下は、変更されたコード例です。

  1. subscriber.php ファイルを変更します。
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->subscribe(['chat-room'], 'processMessage');

function processMessage($redis, $channel, $message)
{
    // 处理接收到的消息,例如将消息推送给聊天室的在线用户
    echo "Received message from channel {$channel}: {$message}
";
    
    // 向其他服务器发送消息
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, 'http://other-server/process-message.php');
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, [
        'channel' => $channel,
        'message' => $message,
    ]);
    curl_exec($curl);
    curl_close($curl);
}
  1. 受信したメッセージを処理するために、process-message.php という名前の新しい PHP ファイルを作成します。
<?php

$channel = $_POST['channel'];
$message = $_POST['message'];

// 在这里实现将消息推送给聊天室的在线用户的逻辑
echo "Received message from channel {$channel}: {$message}
";

上記のコードでは、subscriber.php ファイルを変更し、他のサーバーにメッセージを送信するロジックを追加しました。メッセージを受信すると、HTTP POST リクエストを介してメッセージを他のサーバーの process-message.php ファイルに送信します。このファイルは、受信したメッセージをさらに処理します。

この方法で、複数のサーバーが Redis メッセージを同時にリッスンし、各メッセージが 1 回だけ処理されるようにすることができます。他のサーバーの process-message.php ファイルがメッセージを正しく処理できる限り、そのファイルにメッセージ処理ロジックを実装できます。

これまでに、PHP を使用して Redis メッセージを継続的に監視するサブスクリプションと処理を完了し、複数のサーバーが同時にメッセージを監視する問題を解決しました。これに基づいて、独自のニーズに応じてコードを拡張および最適化し、より複雑な機能を実現できます。

以上がPHP を使用して Redis メッセージ サブスクリプションを継続的にリッスンし、複数のサーバーからのメッセージを処理するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。