Maison >développement back-end >tutoriel php >Comment réaliser une communication en temps réel en utilisant PHP et WebSocket

Comment réaliser une communication en temps réel en utilisant PHP et WebSocket

WBOY
WBOYoriginal
2023-12-17 22:24:441402parcourir

Comment réaliser une communication en temps réel en utilisant PHP et WebSocket

Avec le développement continu de la technologie Internet, la communication en temps réel est devenue un élément indispensable de la vie quotidienne. Une communication en temps réel efficace et à faible latence peut être obtenue grâce à la technologie WebSockets, et PHP, en tant que l'un des langages de développement les plus utilisés dans le domaine Internet, fournit également la prise en charge WebSocket correspondante. Cet article explique comment utiliser PHP et WebSocket pour établir une communication en temps réel et fournit des exemples de code spécifiques.

1. Qu'est-ce que WebSocket

WebSocket est un protocole de communication en duplex intégral sur une seule connexion TCP. Contrairement au protocole HTTP, une fois la connexion WebSocket établie, les données peuvent être échangées directement entre le serveur et le client sans avoir besoin d'interagir via des requêtes et des réponses HTTP. Cela permet à WebSocket d'obtenir une communication en temps réel à faible latence et à haute efficacité, et convient aux jeux en ligne, aux salons de discussion et à d'autres scénarios qui nécessitent une concurrence élevée et une interaction en temps réel.

2. Comment PHP prend en charge WebSocket

PHP fournit des bibliothèques et des frameworks pour implémenter WebSocket, tels que Ratchet, Screw, etc. Ces bibliothèques et frameworks sont implémentés sur la base de l'extension PHP Swoole. Swoole est un framework de communication réseau hautes performances pour PHP qui prend en charge les E/S asynchrones, la coroutine et d'autres fonctionnalités. Il convient à la création de serveurs Web et de jeux à haute concurrence et hautes performances. serveurs et autres applications.

Dans cet article, nous utiliserons la bibliothèque Ratchet pour implémenter WebSocket. Ratchet fournit une implémentation du protocole WebSocket RFC6455 basé sur des normes et présente les caractéristiques de facilité d'utilisation, de flexibilité et de haute évolutivité. Dans le même temps, Ratchet prend également en charge les sous-protocoles WebSockets, tels que STOMP, WAMP, etc., et fournit une documentation complète et des exemples de code pour permettre aux développeurs de démarrer rapidement.

3. Exemple de code pour établir une communication en temps réel

Ci-dessous, nous utilisons une simple application de salle de discussion pour montrer comment utiliser PHP et WebSocket pour établir une communication en temps réel.

  1. Installer Ratchet

Installez Ratchet localement ou côté serveur, vous pouvez l'installer via Composer :

composer require cboden/ratchet
  1. Ecrire un serveur WebSocket

Créez un fichier PHP server.php avec le code suivant :

<?php
require dirname(__DIR__) . '/vendor/autoload.php';

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetWebSocketMessageComponentTrait;

class Chat implements MessageComponentInterface
{
    use MessageComponentTrait;

    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 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();
    }

    public function onMessage(ConnectionInterface $from, $msg)
    {
        foreach ($this->clients as $client) {
            if ($from !== $client) {
                $client->send($msg);
            }
        }
    }
}

$server = new RatchetWebSocketWsServer(new Chat());
$loop = ReactEventLoopFactory::create();
$socket = new ReactSocketServer('0.0.0.0:8080', $loop);
$server = new RatchetServerIoServer($server, $socket, $loop);
echo "Server started
";
$server->run();

Le code ci-dessus crée un simple serveur de salle de discussion, écoutant sur le port 8080, en attente des connexions client. Lorsque le client se connecte, la méthode onOpen est appelée et l'objet de connexion client est enregistré dans un objet ObjectStorage. Lorsque le client envoie un message, la méthode onMessage est appelée pour envoyer le message à tous les clients connectés au serveur. Lorsque le client se déconnecte, la méthode onClose sera appelée pour supprimer l'objet de connexion client de l'objet ObjectStorage.

  1. Écrire un client WebSocket

Créez un fichier HTML client.html avec le code suivant :

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Chat Room</title>
    <style>
        #messages {
            margin-bottom: 10px;
            padding: 5px;
            border: 1px solid #ddd;
            overflow-y: scroll;
            height: 200px;
        }
    </style>
</head>
<body>
    <div>
        <input type="text" id="input-message" placeholder="Write a message...">
        <button id="btn-send">Send</button>
    </div>
    <div id="messages"></div>

    <script>
        var conn = new WebSocket('ws://localhost:8080');
        var messages = document.getElementById('messages');
        var inputMessage = document.getElementById('input-message');
        var btnSend = document.getElementById('btn-send');

        conn.onopen = function(e) {
            messages.innerHTML += '<div>Connected to server</div>'
        };

        conn.onmessage = function(e) {
            messages.innerHTML += '<div>' + e.data + '</div>'
        };

        conn.onerror = function(e) {
            console.log('An error occurred: ' + e.data);
        };

        conn.onclose = function(e) {
            messages.innerHTML += '<div>Connection closed</div>'
        };

        btnSend.onclick = function() {
            if (inputMessage.value) {
                conn.send(inputMessage.value);
                inputMessage.value = '';
            }
        };

        inputMessage.addEventListener('keydown', function(e) {
            if (e.keyCode === 13 && inputMessage.value.trim()) {
                conn.send(inputMessage.value);
                inputMessage.value = '';
            }
        });
    </script>
</body>
</html>

Le code ci-dessus crée un simple client de salle de discussion, établit une connexion avec le serveur via WebSocket et écoute les messages du serveur. . Lorsque l'utilisateur saisit un message dans la zone de texte et clique sur le bouton d'envoi ou appuie sur la touche Entrée, le message est envoyé au serveur et affiché dans la fenêtre de discussion.

  1. Exécutez le serveur et le client WebSocket

Démarrez le serveur WebSocket dans le terminal :

php server.php

Ouvrez la page client client.html dans votre navigateur web, saisissez votre message et envoyez, vous verrez que le message est envoyé au serveur , et les autres clients connectés au serveur recevront le même message. De cette manière, nous avons réussi à mettre en œuvre une communication en temps réel à l'aide de PHP et WebSocket.

4. Résumé

En tant que protocole de communication en temps réel efficace et à faible latence, WebSocket nous offre une nouvelle façon d'interagir en temps réel. Dans le même temps, PHP fournit une multitude de bibliothèques et de frameworks de support WebSocket, nous permettant de créer facilement des applications WebSocket efficaces, rapides et stables. J'espère que cet article pourra vous aider à mieux comprendre et utiliser la technologie WebSocket et à mettre en œuvre davantage d'applications de communication en temps réel.

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