Wie kann ich mit PHP kontinuierlich Redis-Nachrichtenabonnements abhören und Nachrichten von mehreren Servern verarbeiten?

WBOY
Freigeben: 2023-09-05 12:58:01
Original
812 Leute haben es durchsucht

Wie kann ich mit PHP kontinuierlich Redis-Nachrichtenabonnements abhören und Nachrichten von mehreren Servern verarbeiten?

So verwenden Sie PHP, um Redis-Nachrichtenabonnements kontinuierlich zu überwachen und Nachrichten von mehreren Servern zu verarbeiten.

Mit der kontinuierlichen Entwicklung von Internetanwendungen ist Echtzeit-Nachrichten-Push für viele Anwendungen zu einer Anforderung geworden. Als leistungsstarke Cache-Datenbank kann das Publish/Subscribe-Modell von Redis diesen Bedarf gut decken. In diesem Artikel wird erläutert, wie Sie mit PHP Redis-Nachrichten abonnieren und verarbeiten und das Problem lösen, dass mehrere Server gleichzeitig Nachrichten abhören.

Zuerst müssen wir sicherstellen, dass die Redis-Datenbank und die Redis-Erweiterung für PHP installiert und korrekt konfiguriert sind. Wenn Redis und Redis-Erweiterungen nicht installiert sind, können Sie zur Installation auf die entsprechende Dokumentation zurückgreifen.

Als nächstes nehmen wir eine einfache Chatroom-Anwendung als Beispiel, um zu demonstrieren, wie man mit PHP Redis-Nachrichtenabonnements kontinuierlich überwacht und Nachrichten von mehreren Servern verarbeitet.

  1. Erstellen Sie eine PHP-Datei mit dem Namen subscriber.php zum Abonnieren von Redis-Nachrichten.
<?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}
";
    // 在这里实现将消息推送给聊天室的在线用户的逻辑
}
Nach dem Login kopieren
    subscriber.php,用于订阅Redis消息。
<?php

$redis = new Redis();
$redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号
$redis->publish('chat-room', 'Hello, world!'); // 向名为chat-room的频道发布一条消息
Nach dem Login kopieren
  1. 创建一个PHP文件,命名为publisher.php,用于向Redis发布消息。
<?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);
}
Nach dem Login kopieren

通过上述代码,我们实现了一个简单的 Redis 消息订阅和发布功能。可运行subscriber.php来监听Redis的消息,并运行publisher.php向Redis发布一条消息。当收到消息时,processMessage回调函数会被调用,我们可以在该函数中实现对消息的处理逻辑。

然而,如果我们使用多台服务器来处理消息,每台服务器上都运行一个subscriber.php来持续监听Redis的消息,就会导致消息被多次处理,从而出现重复操作的问题。

为了解决这个问题,我们可以借助Redis的PUBLISH/SUBSCRIBE功能。我们可以创建一个额外的服务器,专门用于订阅Redis消息,并将处理消息的逻辑转发给其他服务器。下面是修改后的代码示例:

  1. 修改subscriber.php文件。
<?php

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

// 在这里实现将消息推送给聊天室的在线用户的逻辑
echo "Received message from channel {$channel}: {$message}
";
Nach dem Login kopieren
  1. 创建一个新的PHP文件,命名为process-message.php,用于处理接收到的消息。
rrreee

在上述代码中,我们修改了 subscriber.php 文件,添加了向其他服务器发送消息的逻辑。当收到消息时,它将通过 HTTP POST 请求将消息发送到其他服务器的 process-message.php 文件,后者负责进一步处理接收到的消息。

通过这种方式,我们可以实现多台服务器同时监听Redis消息,并确保每条消息只被处理一次。只要其他服务器的 process-message.phpErstellen Sie eine PHP-Datei mit dem Namen publisher.php zum Veröffentlichen von Nachrichten auf Redis. rrreee

Mit dem obigen Code haben wir eine einfache Funktion zum Abonnieren und Veröffentlichen von Redis-Nachrichten implementiert. Sie können „subscriber.php“ ausführen, um Redis-Nachrichten abzuhören, und „publisher.php“, um eine Nachricht auf Redis zu veröffentlichen. Wenn eine Nachricht empfangen wird, wird die Rückruffunktion processMessage aufgerufen, und wir können die Nachrichtenverarbeitungslogik in dieser Funktion implementieren.

Wenn wir jedoch mehrere Server zum Verarbeiten von Nachrichten verwenden und jeder Server eine subscriber.php ausführt, um Redis-Nachrichten kontinuierlich zu überwachen, wird die Nachricht mehrmals verarbeitet, was zu wiederholten Vorgängen führt. 🎜🎜Um dieses Problem zu lösen, können wir die PUBLISH/ABONNIEREN-Funktion von Redis verwenden. Wir können einen zusätzlichen Server speziell zum Abonnieren von Redis-Nachrichten und zum Weiterleiten der Logik zur Verarbeitung von Nachrichten an andere Server erstellen. Das Folgende ist ein Beispiel für den geänderten Code: 🎜🎜🎜Ändern Sie die Datei subscriber.php. rrreee
    🎜Erstellen Sie eine neue PHP-Datei mit dem Namen process-message.php, um die empfangene Nachricht zu verarbeiten.
rrreee🎜Im obigen Code haben wir die Datei subscriber.php geändert und die Logik zum Senden von Nachrichten an andere Server hinzugefügt. Wenn eine Nachricht empfangen wird, wird die Nachricht über eine HTTP-POST-Anfrage an die Datei process-message.php des anderen Servers gesendet, die für die weitere Verarbeitung der empfangenen Nachricht verantwortlich ist. 🎜🎜Auf diese Weise können wir mehrere Server implementieren, um Redis-Nachrichten gleichzeitig zu überwachen und sicherzustellen, dass jede Nachricht nur einmal verarbeitet wird. Solange die Datei process-message.php anderer Server die Nachricht korrekt verarbeiten kann, können wir die Nachrichtenverarbeitungslogik darin implementieren. 🎜🎜Zu diesem Zeitpunkt haben wir das Abonnement und die Verarbeitung der Verwendung von PHP zur kontinuierlichen Überwachung von Redis-Nachrichten abgeschlossen und das Problem gelöst, dass mehrere Server gleichzeitig Nachrichten überwachen. Auf dieser Basis können Sie den Code entsprechend Ihren eigenen Bedürfnissen erweitern und optimieren, um komplexere Funktionen zu erreichen. 🎜

Das obige ist der detaillierte Inhalt vonWie kann ich mit PHP kontinuierlich Redis-Nachrichtenabonnements abhören und Nachrichten von mehreren Servern verarbeiten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!