Maison  >  Article  >  développement back-end  >  Comment implémenter un modèle de publication-abonnement à longue interrogation à l'aide de PHP

Comment implémenter un modèle de publication-abonnement à longue interrogation à l'aide de PHP

PHPz
PHPzoriginal
2023-04-05 10:31:25722parcourir

Dans le développement Web moderne, la communication en temps réel est devenue une exigence très importante, et la file d'attente de messages et le modèle de publication-abonnement sont devenus des solutions standard pour réaliser une communication en temps réel dans les applications Web. Dans cet article, nous présenterons comment utiliser PHP pour implémenter le mode publication-abonnement à interrogation longue.

Qu'est-ce qu'un sondage long ?

Dans les applications Web traditionnelles, le client envoie une requête au serveur et le serveur renvoie une réponse immédiatement après avoir reçu la requête. L'interrogation longue est une architecture d'application Web plus avancée qui permet au serveur d'attendre un certain temps après avoir reçu une demande client pour déterminer s'il y a un nouveau message. S'il n'y a pas de nouveau message, la connexion sera maintenue jusqu'à ce qu'il y ait un nouveau message. nouveau message. Lorsque de nouveaux messages arrivent, une réponse est renvoyée au client.

Par conséquent, la mise en œuvre de l'interrogation longue est plus efficace que le mode de réponse aux requêtes traditionnel, économise les ressources du serveur et est plus conforme aux besoins de communication en temps réel.

Comment implémenter des sondages longs en utilisant PHP ?

Ci-dessous, nous expliquerons comment utiliser PHP et la file d'attente de messages pour implémenter des interrogations longues.

  1. Installer Message Queue

Avant d'utiliser PHP pour implémenter des interrogations longues, nous devons installer Message Queue. Les files d'attente de messages actuellement populaires incluent RabbitMQ, ZeroMQ et Beanstalkd. Dans cet article, nous utiliserons Beanstalkd pour implémenter des files d'attente de messages.

Tout d’abord, nous devons télécharger et installer Beanstalkd. Dans le système Ubuntu, vous pouvez utiliser la commande suivante pour installer :

sudo apt-get install beanstalkd

Si vous utilisez d'autres systèmes d'exploitation, vous pouvez télécharger la version appropriée sur le site officiel de Beanstalkd et l'installer.

Une fois l'installation terminée, nous pouvons utiliser la commande suivante pour démarrer Beanstalkd :

sudo service beanstalkd start

  1. Écrire du code PHP

Ci-dessous, nous utiliserons un exemple pour montrer comment utiliser Beanstalkd pour implémenter une interrogation longue en PHP.

Tout d'abord, connectez Beanstalkd dans le fichier PHP :

$beanstalk = new Pheanstalk('127.0.0.1');

Ensuite, nous devons définir une fonction pour publier des messages :

function submit($channel, $message ){

global $beanstalk;
$data = json_encode(array('channel' => $channel, 'message' => $message));
$beanstalk->useTube("pubsub")
          ->put($data, Pheanstalk::DEFAULT_PRIORITY, 0, 10);

}

La fonction de cette fonction est d'envoyer le message au tube nommé "pubsub". Nous pouvons envoyer des messages à différents canaux selon les besoins.

Ensuite, nous devons définir une fonction pour s'abonner aux messages :

function Subscribe($channel, $callback){

global $beanstalk;
$beanstalk->watch($channel);
while (true) {
    $job = $beanstalk->reserve();
    if ($job) {
        $data = json_decode($job->getData(), true);
        if ($data['channel'] == $channel) {
            call_user_func($callback, $data['message']);
            $beanstalk->delete($job);
            break;
        } else {
            $beanstalk->bury($job);
        }
    }
}

}

La fonction de cette fonction est d'écouter le canal spécifié lorsqu'un message arrive. , exécutez la fonction de rappel $ et supprimez le message de la file d'attente.

Ensuite, nous devons utiliser du code JavaScript côté client pour implémenter une interrogation longue.

  1. Code JavaScript du client

Dans le client, nous devons définir deux fonctions. L’une est une fonction qui envoie des messages et l’autre est une fonction qui reçoit des messages. Voici l'exemple de code :

function submit(channel, message){

// 发送消息
$.ajax({
    type: 'POST',
    url: 'publish.php',
    data: {channel: channel, message: message},
    success: function(data){}
});

}

function Subscribe(channel, callback){

// 接收消息
function poll(){
    $.ajax({
        type: 'GET',
        url: 'subscribe.php',
        data: 'channel=' + channel,
        dataType: 'json',
        success: function(data){
            if (data && data.message){
                callback(data.message);
            }
            poll();
        },
        error: function(){
            setTimeout(poll, 5000);
        }
    });
}
poll();

}

Dans cet exemple, nous utilisons jQuery pour envoyer une requête POST à envoyer le message, utilisez les requêtes GET pour recevoir des messages.

Il est à noter que lors d'une interrogation longue, le client restera connecté jusqu'à ce qu'une réponse soit reçue. Afin que le serveur ne ferme pas la connexion lorsqu'il est inactif, nous devons ajouter le code suivant à la page pour éviter les délais d'attente :

Dans cet exemple, la page sera actualisée toutes les 600 secondes.

Conclusion

En utilisant PHP et la file d'attente de messages, nous pouvons facilement implémenter le modèle de publication-abonnement à longue interrogation pour répondre aux besoins de communication en temps réel. Cette méthode est très couramment utilisée dans l'échange de données et la communication en temps réel dans les applications Web. Elle peut réduire considérablement l'utilisation d'interrogations et d'autres méthodes pour consommer les performances du serveur dans les applications et améliore l'évolutivité des applications Web.

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