Maison  >  Article  >  développement back-end  >  Exemples de développement PHP WebSocket : exemples pratiques d'implémentation de fonctions spécifiques

Exemples de développement PHP WebSocket : exemples pratiques d'implémentation de fonctions spécifiques

WBOY
WBOYoriginal
2023-09-12 13:27:271292parcourir

PHP WebSocket开发实例:如何实现特定功能的实践案例

Exemples de développement PHP WebSocket : cas pratiques d'implémentation de fonctions spécifiques

Ces dernières années, avec la complexité croissante des applications Web, le protocole HTTP traditionnel a montré certaines lacunes dans la communication en temps réel. Afin de répondre aux besoins de communication en temps réel, WebSocket a vu le jour.

WebSocket est un protocole de communication full-duplex sur une seule connexion TCP, qui permet au serveur de transmettre activement des données au client sans que ce dernier n'envoie de requête. Cela rend la communication en temps réel, les jeux en ligne, la surveillance en temps réel et d'autres applications plus pratiques et efficaces.

Dans cet article, nous présenterons un exemple de développement WebSocket basé sur PHP. À travers ce cas, nous apprendrons le processus pratique de mise en œuvre d'une fonction spécifique.

Supposons que nous souhaitions développer une application de salle de discussion en ligne. Les utilisateurs peuvent envoyer des messages sur la page Web et d'autres utilisateurs peuvent recevoir et répondre immédiatement. Cette fonction implique les points clés suivants :

  1. Construction du serveur WebSocket
  2. Communication entre client et serveur
  3. Envoi et réception de messages
  4. Maintenance de la liste des utilisateurs

Tout d'abord, nous devons construire un serveur WebSocket. En PHP, nous pouvons utiliser la bibliothèque Ratchet pour implémenter les fonctions WebSocket. Installez Ratchet via Composer :

composer require cboden/ratchet

Ensuite, créez un fichier server.php et écrivez le code suivant :

<?php

require 'vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetServerIoServer;
use RatchetHttpHttpServer;
use RatchetWebSocketWsServer;

class Chat implements MessageComponentInterface {
    protected $clients;
    
    public function __construct() {
        $this->clients = new SplObjectStorage;
    }
    
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection! ({$conn->resourceId})
";
    }
    
    public function onMessage(ConnectionInterface $from, $msg) {
        // 处理消息,比如将消息发送给其他在线用户
        foreach ($this->clients as $client) {
            if ($client !== $from) {
                $client->send($msg);
            }
        }
    }
    
    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection {$conn->resourceId} has disconnected
";
    }
    
    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "An error has occurred: {$e->getMessage()}
";
        $conn->close();
    }
}

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8080
);

$server->run();

Ce code crée une classe Chat et implémente l'interface MessageComponentInterface. Nous pouvons définir diverses fonctions de gestion d'événements. Ensuite, nous devons envoyer le message aux autres utilisateurs en ligne. Ici, nous utilisons une boucle foreach pour parcourir tous les clients connectés et déterminer s'il s'agit du client source lui-même.

Exécutez php server.php dans la ligne de commande et le serveur WebSocket démarrera.

Ensuite, nous devons mettre en œuvre la communication avec le serveur sur la page Web. Sur une page Web, nous pouvons utiliser JavaScript pour créer un objet WebSocket pour communiquer avec le backend.

<script>
var conn = new WebSocket('ws://localhost:8080');

conn.onopen = function() {
    console.log('Connected!');
}

conn.onmessage = function(e) {
    console.log('Received: ' + e.data);
}

function sendMessage() {
    var message = document.getElementById('input').value;
    conn.send(message);
}
</script>

Le code ci-dessus crée un objet WebSocket et définit les fonctions de gestionnaire pour les événements onopen et onmessage. Après avoir saisi le message dans la zone de saisie, cliquez sur le bouton d'envoi pour appeler la fonction sendMessage afin d'envoyer le message au serveur.

Enfin, nous devons maintenir une liste d'utilisateurs pour afficher les utilisateurs en ligne et mettre à jour la liste des utilisateurs. Nous pouvons ajouter une logique correspondante aux événements onOpen et onClose côté serveur :

public function onOpen(ConnectionInterface $conn) {
    $this->clients->attach($conn);
    echo "New connection! ({$conn->resourceId})
";
    
    // 将新用户加入用户列表,并广播给其他在线用户
    foreach ($this->clients as $client) {
        $client->send('New user has joined');
    }
}

public function onClose(ConnectionInterface $conn) {
    $this->clients->detach($conn);
    echo "Connection {$conn->resourceId} has disconnected
";
    
    // 将离线用户从用户列表中删除,并广播给其他在线用户
    foreach ($this->clients as $client) {
        $client->send('A user has left');
    }
}

Grâce au code ci-dessus, lorsqu'un nouvel utilisateur rejoint et que l'utilisateur se déconnecte, nous diffuserons les messages correspondants aux autres utilisateurs en ligne pour mettre à jour la liste des utilisateurs.

En résumé, nous avons appris à utiliser PHP WebSocket pour mettre en œuvre le processus de développement de fonctions spécifiques à travers un exemple de salon de discussion en ligne. Bien entendu, WebSocket peut également être utilisé dans un éventail de domaines plus large, comme les notifications push, les jeux en ligne, la surveillance en temps réel, etc. J’espère que les cas pratiques de cet article pourront être utiles à votre apprentissage et à votre développement !

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