Maison  >  Article  >  développement back-end  >  Tutoriel de développement PHP Websocket, création d'une fonction de questionnaire en temps réel

Tutoriel de développement PHP Websocket, création d'une fonction de questionnaire en temps réel

WBOY
WBOYoriginal
2023-12-17 14:46:17985parcourir

PHP Websocket开发教程,构建实时问卷调查功能

Tutoriel de développement PHP Websocket, création d'une fonction de questionnaire en temps réel, nécessitant des exemples de code spécifiques

La technologie Websocket est un protocole réseau émergent qui peut créer des fonctions de communication en temps réel dans les applications Web. Contrairement au protocole HTTP traditionnel, le protocole Websocket peut établir une communication bidirectionnelle et envoyer et recevoir des données sans interruption. Dans cet article, nous présenterons comment créer une fonction d'enquête en temps réel à l'aide de la technologie PHP et Websocket, et fournirons des exemples de code spécifiques.

  1. Installer Ratchet sur le serveur

Ratchet est une bibliothèque PHP permettant de développer des applications Websocket. Avant de commencer, vous devez installer Ratchet sur votre serveur. Utilisez la commande suivante :

composer require cboden/ratchet
  1. Écrivez le code du serveur Websocket

Tout d'abord, nous devons créer un serveur Ratchet WebSocket. Dans cet exemple, nous mettrons tout le code dans un fichier PHP. Dans ce fichier, nous allons créer une classe qui étendra la classe RatchetWebSocketWsServer. Dans le constructeur, nous initialiserons une variable d'instance $clients qui stockera les clients connectés. $clients,该变量将存储已连接的客户端。

以下是服务器代码:

<?php

require __DIR__ . '/vendor/autoload.php'; // 引入 ratchet

use RatchetMessageComponentInterface;
use RatchetConnectionInterface;
use RatchetWebSocketWsServer;

class PollServer implements MessageComponentInterface {
    protected $clients;

    public function __construct() {
        $this->clients = new SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo 'Client ' . $conn->resourceId . ' connected
';
    }

    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo 'Client ' . $conn->resourceId . ' disconnected
';
    }

    public function onMessage(ConnectionInterface $from, $msg) {
        echo 'Received message ' . $msg . ' from client ' . $from->resourceId . "
";
        // 在这里处理逻辑...
    }

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

$server = new RatchetApp('localhost', 8080); // 创建一个新的 WebSocket 服务器
$server->route('/poll', new WsServer(new PollServer())); // 定义路由
$server->run(); // 启动服务器

上述代码定义了一个名为 PollServer 的类,该类实现了 RatchetMessageComponentInterface 接口。 MessageComponentInterface 接口非常简单,它只有四个方法,分别是 onOpenonCloseonMessageonError。这些方法会在客户端连接到服务器时、从服务器断开连接时、接收到新消息时和遇到错误时调用。在上面的代码中,我们只是简单地输出了一些日志,但在处理实际逻辑时,你可以根据需要进行更改。

接下来,我们需要将 PollServer 类传递给 RatchetWebSocketWsServer 类的构造函数中。这将创建一个新的 WebSocket 服务器,该服务器将使用 WebSocket 协议与客户端进行通信。

最后,我们需要定义一个路由,以便客户端可以连接到服务器。在上面的代码中,我们定义了一个名为 /poll 的路由。在生产环境中,你应该为 WebSocket 服务器使用真实的域名和端口。

  1. 编写客户端代码

在本示例中,我们将使用 JavaScript 编写客户端代码。首先,在 HTML 文件中添加以下代码来创建一个 WebSocket 连接:

<!DOCTYPE html>
<html>
<head>
    <title>Real-time Poll</title>
</head>
<body>
    <h1>Real-time Poll</h1>
    <script>
        const connection = new WebSocket('ws://localhost:8080/poll'); // 替换为真实的域名和端口

        connection.addEventListener('open', () => {
            console.log('Connected');
        });

        connection.addEventListener('message', event => {
            const message = JSON.parse(event.data);
            console.log('Received', message);
        });

        connection.addEventListener('close', () => {
            console.log('Disconnected');
        });

        connection.addEventListener('error', error => {
            console.error(error);
        });
    </script>
</body>
</html>

上面的代码创建了一个名为 connection 的新 WebSocket 对象,并使用 ws://localhost:8080/poll 作为服务器 URL。在生产环境中,你应该将此 URL 替换为真实的服务器域名和端口。

接下来,我们添加了几个事件侦听器,用于处理连接建立、接收消息、连接断开和错误事件。在接收到消息时,我们使用 JSON.parse 将消息解析为 JavaScript 对象,并在控制台上记录。

  1. 实现实时问卷调查功能

现在我们已经创建了 WebSocket 服务器和客户端,我们需要实现实时问卷调查功能。考虑以下代码示例:

public function onMessage(ConnectionInterface $from, $msg) {
    echo 'Received message ' . $msg . ' from client ' . $from->resourceId . "
";
    $data = json_decode($msg, true);
    switch ($data['action']) {
        case 'vote':
            $vote = $data['vote'];
            $this->broadcast([
                'action' => 'update',
                'votes' => [
                    'yes' => $this->getVoteCount('yes'),
                    'no' => $this->getVoteCount('no')
                ]
            ]);
            break;
    }
}

private function broadcast($message) {
    foreach ($this->clients as $client) {
        $client->send(json_encode($message));
    }
}

private function getVoteCount($option) {
    // 在这里查询投票选项的数量...
}

在上面的代码中,我们在 onMessage 方法中处理客户端发送的消息。此方法对消息进行解码,并使用 switch 语句检查 action 字段。如果 action 等于 vote,则我们将更新投票计数并使用 broadcast 方法向所有客户端发送更新结果。

broadcast 方法中,我们使用一个循环遍历所有客户端并将消息发送到每个客户端。该方法将 JSON 编码的消息发送到客户端,客户端将与 connection.addEventListener('message', ...)

Voici le code du serveur :
    <?php
    
    require __DIR__ . '/vendor/autoload.php';
    
    use RatchetMessageComponentInterface;
    use RatchetConnectionInterface;
    use RatchetWebSocketWsServer;
    
    class PollServer implements MessageComponentInterface {
        protected $clients;
    
        public function __construct() {
            $this->clients = new SplObjectStorage;
        }
    
        public function onOpen(ConnectionInterface $conn) {
            $this->clients->attach($conn);
            echo 'Client ' . $conn->resourceId . ' connected
    ';
        }
    
        public function onClose(ConnectionInterface $conn) {
            $this->clients->detach($conn);
            echo 'Client ' . $conn->resourceId . ' disconnected
    ';
        }
    
        public function onMessage(ConnectionInterface $from, $msg) {
            echo 'Received message ' . $msg . ' from client ' . $from->resourceId . "
    ";
            $data = json_decode($msg, true);
            switch ($data['action']) {
                case 'vote':
                    $vote = $data['vote'];
                    $this->broadcast([
                        'action' => 'update',
                        'votes' => [
                            'yes' => $this->getVoteCount('yes'),
                            'no' => $this->getVoteCount('no')
                        ]
                    ]);
                    break;
            }
        }
    
        public function onError(ConnectionInterface $conn, Exception $e) {
            echo "An error has occurred: {$e->getMessage()}
    ";
            $conn->close();
        }
    
        private function broadcast($message) {
            foreach ($this->clients as $client) {
                $client->send(json_encode($message));
            }
        }
    
        private function getVoteCount($option) {
            // 在这里查询投票选项的数量...
        }
    }
    
    $server = new RatchetApp('localhost', 8080);
    $server->route('/poll', new WsServer(new PollServer()));
    $server->run();
  1. Le code ci-dessus définit une classe nommée PollServer, qui implémente l'interface RatchetMessageComponentInterface. L'interface MessageComponentInterface est très simple. Elle ne comporte que quatre méthodes, à savoir onOpen, onClose, onMessage et onErreur. Ces méthodes sont appelées lorsque le client se connecte au serveur, lorsqu'il se déconnecte du serveur, lorsqu'un nouveau message est reçu et lorsqu'une erreur est rencontrée. Dans le code ci-dessus, nous générons simplement quelques journaux, mais vous pouvez les modifier si nécessaire en fonction de la logique réelle. </code.> </li> </ol>Ensuite, nous devons passer la classe <code>PollServer au constructeur de la classe RatchetWebSocketWsServer. Cela créera un nouveau serveur WebSocket qui communiquera avec le client à l'aide du protocole WebSocket.

    Enfin, nous devons définir un itinéraire pour que les clients puissent se connecter au serveur. Dans le code ci-dessus, nous définissons une route nommée /poll. Dans un environnement de production, vous devez utiliser le vrai nom de domaine et le port du serveur WebSocket.

      Écriture de code côté client

      Dans cet exemple, nous utiliserons JavaScript pour écrire du code côté client. Tout d'abord, ajoutez le code suivant dans le fichier HTML pour créer une connexion WebSocket :

      <!DOCTYPE html>
      <html>
      <head>
          <title>Real-time Poll</title>
      </head>
      <body>
          <h1>Real-time Poll</h1>
          <form>
              <label><input type="radio" name="vote" value="yes"> Yes</label>
              <label><input type="radio" name="vote" value="no"> No</label>
              <button type="submit">Vote</button>
          </form>
          <ul>
              <li>Yes: <span id="yes-votes">0</span></li>
              <li>No: <span id="no-votes">0</span></li>
          </ul>
          <script>
              const connection = new WebSocket('ws://localhost:8080/poll');
      
              connection.addEventListener('open', () => {
                  console.log('Connected');
              });
      
              connection.addEventListener('message', event => {
                  const message = JSON.parse(event.data);
                  if (message.action === 'update') {
                      document.getElementById('yes-votes').textContent = message.votes.yes;
                      document.getElementById('no-votes').textContent = message.votes.no;
                  }
              });
      
              connection.addEventListener('close', () => {
                  console.log('Disconnected');
              });
      
              connection.addEventListener('error', error => {
                  console.error(error);
              });
      
              document.querySelector('form').addEventListener('submit', event => {
                  event.preventDefault();
                  const vote = document.querySelector('input[name="vote"]:checked').value;
                  connection.send(JSON.stringify({
                      action: 'vote',
                      vote: vote
                  }));
              });
          </script>
      </body>
      </html>

      Le code ci-dessus crée un nouvel objet WebSocket nommé connection et utilise ws://localhost : 8080/poll comme URL du serveur. Dans un environnement de production, vous devez remplacer cette URL par le nom de domaine et le port réels du serveur.

        Ensuite, nous avons ajouté plusieurs écouteurs d'événements pour gérer l'établissement de la connexion, la réception des messages, la déconnexion de la connexion et les événements d'erreur. Lorsqu'un message est reçu, nous utilisons JSON.parse pour analyser le message dans un objet JavaScript et l'enregistrer sur la console.
        1. Implémenter la fonction de questionnaire en temps réel

        Maintenant que nous avons créé le serveur et le client WebSocket, nous devons implémenter la fonction de questionnaire en temps réel. Considérons l'exemple de code suivant : 🎜rrreee🎜Dans le code ci-dessus, nous traitons le message envoyé par le client dans la méthode onMessage. Cette méthode décode le message et vérifie le champ action à l'aide d'une instruction switch. Si action est égal à vote, alors nous mettons à jour le décompte des votes et envoyons la mise à jour à tous les clients en utilisant la méthode broadcast. 🎜🎜Dans la méthode broadcast, nous utilisons une boucle pour parcourir tous les clients et envoyer le message à chaque client. Cette méthode envoie un message codé en JSON au client, qui sera utilisé avec le gestionnaire d'événements enregistré dans le gestionnaire d'événements connection.addEventListener('message', ...). 🎜🎜🎜Exemples de code complets🎜🎜🎜Voici les versions complètes de tous les exemples de code dans cet article : 🎜🎜server.php : 🎜rrreee🎜index.html : 🎜rrreee🎜Dans l'exemple de code ci-dessus, nous avons fourni un simple Formulaire HTML, utilisé pour envoyer les résultats du vote au serveur. Lorsque l'utilisateur soumet le formulaire, nous envoyons les résultats du vote sous forme d'objet JSON à une connexion WebSocket sur le serveur. 🎜🎜Nous mettons à jour les résultats du vote en HTML lorsque le client reçoit le message de mise à jour. 🎜🎜🎜Résumé🎜🎜🎜Dans cet article, nous avons présenté comment créer une fonction d'enquête en temps réel à l'aide de la technologie PHP et Websocket, et avons fourni des exemples de code spécifiques. La technologie Websocket peut être utilisée pour mettre en œuvre diverses fonctions de communication en temps réel, telles que des salons de discussion, des jeux, des mises à jour en temps réel, etc. Si vous souhaitez en savoir plus sur la technologie Websocket, nous vous recommandons de consulter la documentation de Ratchet, qui fournit de nombreux guides détaillés et exemples sur le développement de Websocket. 🎜

      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