PHP Websocket-Entwicklungs-Tutorial, Aufbau einer Echtzeit-Fragebogenfunktion, erfordert spezifische Codebeispiele
Websocket-Technologie ist ein neues Netzwerkprotokoll, das Echtzeit-Kommunikationsfunktionen in Webanwendungen erstellen kann. Im Gegensatz zum herkömmlichen HTTP-Protokoll kann das Websocket-Protokoll eine bidirektionale Kommunikation erreichen und Daten ununterbrochen senden und empfangen. In diesem Artikel stellen wir vor, wie man mithilfe der PHP- und Websocket-Technologie eine Echtzeit-Umfragefunktion erstellt, und stellen spezifische Codebeispiele bereit.
Ratchet ist eine PHP-Bibliothek zum Entwickeln von Websocket-Anwendungen. Bevor Sie beginnen, müssen Sie Ratchet auf Ihrem Server installieren. Verwenden Sie den folgenden Befehl:
composer require cboden/ratchet
Zuerst müssen wir einen Ratchet WebSocket-Server erstellen. In diesem Beispiel werden wir den gesamten Code in eine PHP-Datei einfügen. In dieser Datei erstellen wir eine Klasse, die die Klasse RatchetWebSocketWsServer erweitert. Im Konstruktor initialisieren wir eine Instanzvariable $clients
, die die verbundenen Clients speichert. $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
, die die Schnittstelle RatchetMessageComponentInterface
implementiert. Die MessageComponentInterface
-Schnittstelle ist sehr einfach. Sie verfügt nur über vier Methoden, nämlich onOpen
, onClose
, onMessage
und onError
. Diese Methoden werden aufgerufen, wenn der Client eine Verbindung zum Server herstellt, wenn er die Verbindung zum Server trennt, wenn eine neue Nachricht empfangen wird und wenn ein Fehler auftritt. Im obigen Code geben wir einfach einige Protokolle aus, aber Sie können es bei Bedarf ändern, wenn Sie sich mit der eigentlichen Logik befassen. PollServer
an den Konstruktor der Klasse RatchetWebSocketWsServer
übergeben. Dadurch wird ein neuer WebSocket-Server erstellt, der über das WebSocket-Protokoll mit dem Client kommuniziert. Abschließend müssen wir eine Route definieren, damit Clients eine Verbindung zum Server herstellen können. Im obigen Code definieren wir eine Route mit dem Namen /poll
. In einer Produktionsumgebung sollten Sie den echten Domänennamen und Port für den WebSocket-Server verwenden. In diesem Beispiel verwenden wir JavaScript, um clientseitigen Code zu schreiben. Fügen Sie zunächst den folgenden Code in die HTML-Datei ein, um eine WebSocket-Verbindung zu erstellen:
<!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>
Der obige Code erstellt ein neues WebSocket-Objekt mit dem Namen connection
und verwendet ws://localhost: 8080/poll
als Server-URL. In einer Produktionsumgebung sollten Sie diese URL durch den echten Serverdomänennamen und -port ersetzen.
JSON.parse
, um die Nachricht in ein JavaScript-Objekt zu analysieren und auf der Konsole zu protokollieren. onMessage
. Diese Methode dekodiert die Nachricht und überprüft das Feld action
mithilfe einer switch
-Anweisung. Wenn action
gleich vote
ist, aktualisieren wir die Stimmenzahl und senden die Aktualisierung mithilfe der Methode broadcast
an alle Clients. 🎜🎜Bei der broadcast
-Methode verwenden wir eine Schleife, um alle Clients zu durchlaufen und die Nachricht an jeden Client zu senden. Diese Methode sendet eine JSON-codierte Nachricht an den Client, die mit dem im Ereignishandler connection.addEventListener('message', ...)
registrierten Ereignishandler verwendet wird. 🎜🎜🎜Vollständige Codebeispiele🎜🎜🎜Hier sind die Vollversionen aller Codebeispiele in diesem Artikel: 🎜🎜server.php: 🎜rrreee🎜index.html: 🎜rrreee🎜Im obigen Codebeispiel haben wir ein einfaches bereitgestellt HTML-Formular, das zum Senden von Abstimmungsergebnissen an den Server verwendet wird. Wenn der Benutzer das Formular absendet, senden wir die Abstimmungsergebnisse als JSON-Objekt an eine WebSocket-Verbindung auf dem Server. 🎜🎜Wir aktualisieren die Abstimmungsergebnisse in HTML, wenn der Kunde die Aktualisierungsnachricht erhält. 🎜🎜🎜Zusammenfassung🎜🎜🎜In diesem Artikel haben wir vorgestellt, wie man mithilfe von PHP und Websocket-Technologie eine Echtzeit-Umfragefunktion erstellt, und spezifische Codebeispiele bereitgestellt. Mithilfe der Websocket-Technologie können verschiedene Echtzeit-Kommunikationsfunktionen wie Chatrooms, Spiele, Echtzeit-Updates usw. implementiert werden. Wenn Sie mehr über die Websocket-Technologie erfahren möchten, empfehlen wir Ihnen, sich die Dokumentation von Ratchet anzusehen, die viele detaillierte Anleitungen und Beispiele zur Websocket-Entwicklung enthält. 🎜Das obige ist der detaillierte Inhalt vonPHP-Websocket-Entwicklungs-Tutorial, Aufbau einer Echtzeit-Fragebogenfunktion. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!