Heim > Artikel > Backend-Entwicklung > 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.
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} "; // 在这里实现将消息推送给聊天室的在线用户的逻辑 }
subscriber.php
,用于订阅Redis消息。<?php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); // Redis服务器地址和端口号 $redis->publish('chat-room', 'Hello, world!'); // 向名为chat-room的频道发布一条消息
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); }
通过上述代码,我们实现了一个简单的 Redis 消息订阅和发布功能。可运行subscriber.php来监听Redis的消息,并运行publisher.php向Redis发布一条消息。当收到消息时,processMessage
回调函数会被调用,我们可以在该函数中实现对消息的处理逻辑。
然而,如果我们使用多台服务器来处理消息,每台服务器上都运行一个subscriber.php来持续监听Redis的消息,就会导致消息被多次处理,从而出现重复操作的问题。
为了解决这个问题,我们可以借助Redis的PUBLISH/SUBSCRIBE功能。我们可以创建一个额外的服务器,专门用于订阅Redis消息,并将处理消息的逻辑转发给其他服务器。下面是修改后的代码示例:
subscriber.php
文件。<?php $channel = $_POST['channel']; $message = $_POST['message']; // 在这里实现将消息推送给聊天室的在线用户的逻辑 echo "Received message from channel {$channel}: {$message} ";
process-message.php
,用于处理接收到的消息。在上述代码中,我们修改了 subscriber.php
文件,添加了向其他服务器发送消息的逻辑。当收到消息时,它将通过 HTTP POST 请求将消息发送到其他服务器的 process-message.php
文件,后者负责进一步处理接收到的消息。
通过这种方式,我们可以实现多台服务器同时监听Redis消息,并确保每条消息只被处理一次。只要其他服务器的 process-message.php
Erstellen Sie eine PHP-Datei mit dem Namen publisher.php
zum Veröffentlichen von Nachrichten auf Redis. rrreee
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
. rrreeeprocess-message.php
, um die empfangene Nachricht zu verarbeiten. 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!