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, 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.
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
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
接口非常简单,它只有四个方法,分别是 onOpen
、onClose
、onMessage
和 onError
。这些方法会在客户端连接到服务器时、从服务器断开连接时、接收到新消息时和遇到错误时调用。在上面的代码中,我们只是简单地输出了一些日志,但在处理实际逻辑时,你可以根据需要进行更改。
接下来,我们需要将 PollServer
类传递给 RatchetWebSocketWsServer
类的构造函数中。这将创建一个新的 WebSocket 服务器,该服务器将使用 WebSocket 协议与客户端进行通信。
最后,我们需要定义一个路由,以便客户端可以连接到服务器。在上面的代码中,我们定义了一个名为 /poll
的路由。在生产环境中,你应该为 WebSocket 服务器使用真实的域名和端口。
在本示例中,我们将使用 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 对象,并在控制台上记录。
现在我们已经创建了 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', ...)
<?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();
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 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.
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.
JSON.parse
pour analyser le message dans un objet JavaScript et l'enregistrer sur la console. 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!