Maison  >  Article  >  développement back-end  >  Utilisez php pour développer Websocket afin d'implémenter la fonction push en temps réel

Utilisez php pour développer Websocket afin d'implémenter la fonction push en temps réel

王林
王林original
2023-12-02 12:44:24844parcourir

Utilisez php pour développer Websocket afin dimplémenter la fonction push en temps réel

Titre : Utilisez PHP pour développer Websocket afin d'obtenir une fonction push en temps réel

Websocket est un protocole de communication basé sur le protocole TCP. Dans le développement Web, Websocket peut être utilisé pour implémenter une fonction push en temps réel pour obtenir un temps réel. communication ou mise à jour en temps réel des données. Dans cet article, nous développerons un serveur Websocket en utilisant le langage PHP et fournirons des exemples de code spécifiques.

1. Présentation

Websocket est un protocole de communication full-duplex Par rapport au protocole HTTP traditionnel, Websocket est plus adapté aux scénarios de communication en temps réel. Les fonctionnalités du protocole Websocket incluent :

  1. Prend en charge la communication full-duplex et peut envoyer et recevoir des données simultanément.
  2. Compatible avec le protocole HTTP, utilise un protocole de prise de contact de type HTTP pour l'établissement de la connexion et peut communiquer via le port HTTP/HTTPS.
  3. Les données peuvent être envoyées à tout moment sans attendre le cycle demande-réponse.
  4. Prend en charge la communication entre domaines et peut communiquer sous différents noms de domaine.

2. Préparation de l'environnement de développement

Avant de commencer le développement, vous devez préparer certains outils et environnement :

  1. Installer PHP : Assurez-vous que l'interpréteur PHP a été installé sur votre système.
  2. Installer Composer : Composer est un outil de gestion des dépendances pour PHP Nous l'utiliserons pour installer les bibliothèques liées à Websocket.
  3. Choisissez un éditeur : vous pouvez choisir n'importe quel éditeur que vous aimez pour le développement, tel que VS Code, Sublime Text, etc.

3. Installez la bibliothèque Websocket

En PHP, il existe de nombreuses bibliothèques Websocket matures parmi lesquelles choisir, parmi lesquelles les plus couramment utilisées sont Ratchet, Swoole, etc. Dans cet article, nous utiliserons Ratchet pour le développement.

  1. Créez un fichier composer.json dans le répertoire racine du projet et ajoutez le contenu suivant : composer.json文件,并添加以下内容:
{
    "require": {
        "cboden/ratchet": "^0.4"
    }
}
  1. 打开终端,切换到项目根目录,执行以下命令安装Ratchet库:
composer install

四、编写Websocket服务器代码

在创建Websocket服务器之前,我们先来讨论一下Websocket的工作流程。

  1. 连接建立:客户端与服务器建立Websocket连接,客户端发送一个HTTP请求,服务器返回一个协议切换的响应,建立连接。
  2. 消息传输:双方可以通过send方法发送消息,并通过onMessage事件接收消息。
  3. 连接关闭:客户端或服务器端任意一方发送关闭帧来关闭连接。

下面是一个使用Ratchet库编写Websocket服务器的示例代码:

<?php

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

require 'vendor/autoload.php';

class MyWebSocket 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 closed: {$conn->resourceId}
";
    }

    public function onError(ConnectionInterface $conn, Exception $e) {
        echo "An error occurred: {$e->getMessage()}
";
        $conn->close();
    }
}

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

$server->run();

以上代码定义了一个MyWebSocket类,实现了MessageComponentInterface接口中的方法,用于处理连接、消息、关闭和错误事件。在onOpen事件中,我们将新建立的连接加入到$clients集合中;在onMessage事件中,我们会遍历所有连接并将消息发送给其他客户端;在onClose事件中,我们从$clients集合中删除关闭的连接;在onError

php server.php

    Ouvrez le terminal, passez au répertoire racine du projet, et exécutez la commande suivante pour installer la bibliothèque Ratchet :

    New connection: 1
    New connection: 2
    Message received: Hello from client 1
    Message received: Hello from client 2
    Connection closed: 1

    4. Écrivez le code du serveur Websocket

    Avant de créer le serveur Websocket, discutons d'abord du flux de travail de Websocket.

    Établissement de la connexion : le client établit une connexion Websocket avec le serveur. Le client envoie une requête HTTP et le serveur renvoie une réponse de changement de protocole pour établir la connexion.

    Transmission de messages : les deux parties peuvent envoyer des messages via la méthode send et recevoir des messages via l'événement onMessage.

    Fermeture de connexion : le client ou le serveur envoie une trame de fermeture pour fermer la connexion.

    Ce qui suit est un exemple de code pour écrire un serveur Websocket à l'aide de la bibliothèque Ratchet : 🎜
    <!DOCTYPE html>
    <html>
    <head>
        <title>Websocket Client</title>
        <script>
            var socket = new WebSocket("ws://localhost:8080");
    
            socket.onopen = function() {
                console.log("Connected");
            };
    
            socket.onmessage = function(event) {
                console.log("Message received: " + event.data);
            };
    
            socket.onclose = function(event) {
                console.log("Connection closed");
            };
    
            function sendMessage() {
                var message = document.getElementById("message").value;
                socket.send(message);
            }
        </script>
    </head>
    <body>
        <input type="text" id="message">
        <button onclick="sendMessage()">Send</button>
    </body>
    </html>
    🎜Le code ci-dessus définit une classe MyWebSocket, qui implémente les méthodes de MessageComponentInterface interface. Utiliser Pour gérer les événements de connexion, de message, de fermeture et d'erreur. Dans l'événement onOpen, nous ajoutons la connexion nouvellement établie à la collection $clients ; dans l'événement onMessage, nous parcourons toutes les connexions et envoyons des messages. aux autres clients ; dans l'événement onClose, nous supprimons la connexion fermée de la collection $clients dans l'événement onError, nous gérons l'exception ; et fermez la connexion. 🎜🎜5. Exécutez le serveur Websocket🎜🎜Basculez vers le répertoire racine du projet dans le terminal et exécutez la commande suivante pour démarrer le serveur Websocket :🎜rrreee🎜Si tout est normal, vous verrez un résultat similaire à celui-ci :🎜rrreee🎜 6. Écrivez le code client🎜🎜Enfin, nous devons écrire un client pour le tester. 🎜rrreee🎜Dans cet exemple, nous utilisons JavaScript pour créer une connexion Websocket et imprimer les journaux correspondants lorsque la connexion est établie, que les messages sont reçus et que la connexion est fermée. Sur la page, nous fournissons une zone de saisie et un bouton d'envoi pour envoyer des messages. 🎜🎜7. Résumé🎜🎜Cet article présente la méthode de développement d'un serveur Websocket à l'aide de PHP et fournit des exemples de code spécifiques pour aider les lecteurs à comprendre le principe de fonctionnement et l'utilisation de Websocket. Websocket a des capacités de communication en temps réel et peut être utilisé pour mettre en œuvre des push en temps réel, des salles de discussion, des jeux multijoueurs et d'autres scénarios. J'espère que cet article vous sera utile. 🎜

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