Maison  >  Article  >  développement back-end  >  Comment utiliser PHP pour écouter en continu les abonnements aux messages Redis et traiter les messages de plusieurs serveurs ?

Comment utiliser PHP pour écouter en continu les abonnements aux messages Redis et traiter les messages de plusieurs serveurs ?

WBOY
WBOYoriginal
2023-09-05 12:45:33825parcourir

Comment utiliser PHP pour écouter en continu les abonnements aux messages Redis et traiter les messages de plusieurs serveurs ?

Comment utiliser PHP pour surveiller en permanence les abonnements aux messages Redis et traiter les messages de plusieurs serveurs

Avec le développement continu des applications Internet, le push de messages en temps réel est devenu une exigence pour de nombreuses applications. En tant que base de données de cache hautes performances, le modèle de publication/abonnement de Redis peut bien répondre à cette demande. Cet article explique comment utiliser PHP pour s'abonner et traiter les messages Redis, et résoudre le problème de plusieurs serveurs écoutant des messages en même temps.

Tout d'abord, nous devons nous assurer que la base de données Redis et l'extension Redis pour PHP sont installées et correctement configurées. Si Redis et les extensions Redis ne sont pas installées, vous pouvez vous référer à la documentation appropriée pour les installer.

Ensuite, nous prenons comme exemple une simple application de salle de discussion pour montrer comment utiliser PHP pour surveiller en permanence les abonnements aux messages Redis et traiter les messages provenant de plusieurs serveurs.

  1. Créez un fichier PHP nommé subscriber.php pour vous abonner aux messages Redis.
<?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的频道发布一条消息
  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);
}

通过上述代码,我们实现了一个简单的 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}
";
  1. 创建一个新的PHP文件,命名为process-message.php,用于处理接收到的消息。
rrreee

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

通过这种方式,我们可以实现多台服务器同时监听Redis消息,并确保每条消息只被处理一次。只要其他服务器的 process-message.phpCréez un fichier PHP nommé publisher.php pour publier des messages sur Redis. rrreee

Grâce au code ci-dessus, nous avons implémenté une fonction simple d'abonnement et de publication de messages Redis. Vous pouvez exécuter Subscriber.php pour écouter les messages Redis et exécuter editor.php pour publier un message sur Redis. Lorsqu'un message est reçu, la fonction de rappel processMessage sera appelée et nous pourrons implémenter la logique de traitement des messages dans cette fonction.

Cependant, si nous utilisons plusieurs serveurs pour traiter les messages et que chaque serveur exécute un Subscriber.php pour surveiller en permanence les messages Redis, le message sera traité plusieurs fois, ce qui entraînera des opérations répétées. 🎜🎜Afin de résoudre ce problème, nous pouvons utiliser la fonction PUBLISH/SUBSCRIBE de Redis. Nous pouvons créer un serveur supplémentaire spécifiquement pour vous abonner aux messages Redis et transmettre la logique de traitement des messages vers d'autres serveurs. Voici un exemple du code modifié : 🎜🎜🎜Modifiez le fichier subscriber.php. rrreee
    🎜Créez un nouveau fichier PHP nommé process-message.php pour traiter le message reçu.
rrreee🎜Dans le code ci-dessus, nous avons modifié le fichier subscriber.php et ajouté la logique pour envoyer des messages à d'autres serveurs. Lorsqu'un message est reçu, il l'enverra via une requête HTTP POST au fichier process-message.php de l'autre serveur, qui est responsable du traitement ultérieur du message reçu. 🎜🎜De cette façon, nous pouvons implémenter plusieurs serveurs pour surveiller les messages Redis en même temps et garantir que chaque message n'est traité qu'une seule fois. Tant que le fichier process-message.php des autres serveurs peut traiter le message correctement, nous pouvons y implémenter la logique de traitement du message. 🎜🎜À ce stade, nous avons terminé l'abonnement et le traitement de l'utilisation de PHP pour surveiller en continu les messages Redis, et résolu le problème de plusieurs serveurs surveillant les messages en même temps. Sur cette base, vous pouvez étendre et optimiser le code selon vos besoins pour réaliser des fonctions plus complexes. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn