WebSockets in PHP verstehen

WBOY
Freigeben: 2024-09-09 06:36:07
Original
827 Leute haben es durchsucht

Understanding WebSockets in PHP

WebSocket 通过单个 TCP 连接提供实时、全双工通信通道。与 HTTP 不同,HTTP 中客户端向服务器发送请求并等待响应,WebSocket 允许客户端和服务器之间进行连续通信,而无需多次请求。这非常适合需要实时更新的应用程序,例如聊天应用程序、实时通知和在线游戏。

在本指南中,我们将探索 WebSocket、它们的工作原理以及如何在 PHP 中实现它们。


什么是 WebSocket?

WebSockets 支持 Web 浏览器(或任何其他客户端)和服务器之间的交互式通信。以下是 WebSocket 的关键方面:

  1. 全双工通信:客户端和服务器都可以随时向对方发送消息,使连接比传统的 HTTP 轮询更加高效。
  2. 持久连接:一旦建立,WebSocket 连接将保持打开状态,直到客户端或服务器显式关闭为止。
  3. 低延迟:由于 WebSocket 无需为每个请求打开新连接,因此可以减少延迟,使其成为实时通信的理想选择。

WebSocket 的工作原理

  1. 握手:通信以 HTTP 请求开始。客户端发送带有 Upgrade 标头的 HTTP 请求,将连接从 HTTP 切换到 WebSockets。
  2. 连接建立:一旦服务器确认握手,连接就建立了,客户端和服务器都可以开始发送和接收消息。
  3. 消息传递:数据通过帧传输,帧是轻量级的,可以来回发送,无需 HTTP 标头的开销。
  4. 连接终止:客户端或服务器都可以终止连接。

何时使用 WebSocket

  • 实时应用程序:例如聊天应用程序、实时通知和协作编辑。
  • 游戏:适用于需要频繁更新的多人在线游戏。
  • 实时动态:流式传输股票价格、体育比分或来自 IoT 设备的实时数据。
  • 协作工具:适用于 Google Docs 等多个用户需要实时查看更新的应用。

在 PHP 中实现 WebSocket

要在 PHP 中实现 WebSocket,您可以使用诸如 Ratchet 之类的库,这是一个专门为使用 WebSocket 进行实时双向通信而设计的 PHP 库。


使用 Ratchet 逐步实现 WebSocket

第 1 步:通过 Composer 安装 Ratchet

首先,您需要安装 Ratchet 库。假设你已经安装了 Composer,你可以运行以下命令:

composer require cboden/ratchet
Nach dem Login kopieren

第 2 步:用 PHP 创建 WebSocket 服务器

让我们创建一个简单的 WebSocket 服务器来处理连接和消息。

  1. 在WebSocketServer.php中创建WebSocket服务器类
<?php
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class WebSocketServer implements MessageComponentInterface {
    protected $clients;

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

    // Called when a new client connects
    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo "New connection: ({$conn->resourceId})\n";
    }

    // Called when a client sends a message
    public function onMessage(ConnectionInterface $from, $msg) {
        echo "New message: $msg\n";

        foreach ($this->clients as $client) {
            if ($from !== $client) {
                // Send the message to everyone except the sender
                $client->send($msg);
            }
        }
    }

    // Called when a connection is closed
    public function onClose(ConnectionInterface $conn) {
        $this->clients->detach($conn);
        echo "Connection closed: ({$conn->resourceId})\n";
    }

    // Called if an error occurs
    public function onError(ConnectionInterface $conn, \Exception $e) {
        echo "Error: {$e->getMessage()}\n";
        $conn->close();
    }
}
Nach dem Login kopieren

此类实现 Ratchet 的 MessageComponentInterface,它定义了处理新连接、传入消息、关闭连接和错误的方法。

第 3 步:运行 WebSocket 服务器

创建一个新的 PHP 脚本来启动 WebSocket 服务器,例如 start_server.php。

<?php
require __DIR__ . '/vendor/autoload.php';
use Ratchet\Http\HttpServer;
use Ratchet\Server\IoServer;
use Ratchet\WebSocket\WsServer;

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new WebSocketServer()
        )
    ),
    8080 // Port number for the WebSocket server
);

$server->run();
Nach dem Login kopieren

您可以通过运行以下脚本来启动服务器:

php start_server.php
Nach dem Login kopieren

服务器现在将在 ws://localhost:8080 上运行。

第 4 步:创建前端以连接到 WebSocket 服务器

现在,让我们使用 jQueryJavaScript 创建一个 HTML 文件来连接到 WebSocket 服务器。

  1. 创建 HTML 文件index.html:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>WebSocket Chat</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h2>WebSocket Chat</h2>
    <input type="text" id="message" placeholder="Enter your message">
    <button id="send">Send</button>
    <div id="chat"></div>

    <script>
        $(document).ready(function() {
            var ws = new WebSocket('ws://localhost:8080');

            // When receiving a message from the server
            ws.onmessage = function(event) {
                $('#chat').append('<p>' + event.data + '</p>');
            };

            // Sending a message to the server
            $('#send').click(function() {
                var msg = $('#message').val();
                ws.send(msg);
                $('#message').val('');
            });
        });
    </script>
</body>
</html>
Nach dem Login kopieren

这个简单的界面允许您输入消息并将其发送到 WebSocket 服务器。所有连接的客户端都会收到该消息并显示它。

第 5 步:测试 WebSocket 连接

  1. 通过运行 php start_server.php 启动 WebSocket 服务器。
  2. 在浏览器中打开index.html。
  3. 在另一个浏览器或选项卡中打开同一页面以模拟多个客户端。

当您从一个客户端发送消息时,它将显示在所有连接的客户端的浏览器中。


Vorteile der Verwendung von WebSockets in PHP

  • Echtzeit-Updates: WebSockets bieten Echtzeit-Updates ohne den Aufwand von HTTP-Abfragen.
  • Geringere Latenz: Da die Verbindung offen bleibt, können Nachrichten sofort gesendet werden, was die Latenz reduziert.
  • Bidirektionale Kommunikation: Sowohl der Server als auch der Client können gleichzeitig Nachrichten aneinander senden, im Gegensatz zu herkömmlichem HTTP, bei dem die Kommunikation vom Client initiiert wird.

Anwendungsfälle für WebSockets in PHP

  • Chat-Anwendungen: WebSockets eignen sich perfekt für Echtzeit-Chat-Anwendungen, bei denen Nachrichten sofort an alle Benutzer gesendet werden müssen.
  • Live-Benachrichtigungen: Für Apps, die Live-Benachrichtigungen senden müssen (z. B. soziale Medien, Aktienkurse).
  • Tools für die Zusammenarbeit in Echtzeit: WebSockets ermöglichen die Zusammenarbeit in Echtzeit, beispielsweise die Live-Bearbeitung von Dokumenten.
  • Online-Gaming: Multiplayer-Onlinespiele profitieren von der Kommunikation mit geringer Latenz von WebSockets.

Fazit

WebSockets bieten eine leistungsstarke Lösung für die Echtzeit-Vollduplex-Kommunikation zwischen Client und Server, ideal für Chat-Systeme, Live-Benachrichtigungen und andere Echtzeitanwendungen. Durch die Verwendung von PHP mit Bibliotheken wie Ratchet können Sie ganz einfach einen WebSocket-Server einrichten und ihn für eine bessere Benutzereinbindung und Reaktionsfähigkeit in Ihre Anwendungen integrieren.

Das obige ist der detaillierte Inhalt vonWebSockets in PHP verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:dev.to
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage