17611538698
webmaster@21cto.com

使用 PHP WebSocket:构建实时应用程序

图片

如今,与当今快速变化的现代级软件系统进行实时通信已经成为一种必需品,无论是更新实时聊天系统、多人游戏还是协作工具,因为一切都必须立即进行。

这正是 WebSocket 发挥作用的地方:它们在服务器和客户端之间提供全双工通信通道。在本篇文章中,我们将讨论 WebSocket 在 PHP 中的工作原理,以及如何构建高性能实时应用程序。

什么是 WebSocket?


在直接了解实现细节之前,最好先了解 WebSocket 实际上是什么。


WebSocket 是一种通信协议,它通过单个长期服务器连接提供全双工双向通信。


与强制客户端不断请求新数据(轮询)的 HTTP 相比,WebSocket 允许客户端和服务器相互发送任何新数据,而无需任何额外开销。


通俗地说,WebSocket 连接一旦打开就会保持打开状态;可以实时交换数据,而无需一次又一次地重新连接。


为什么使用 WebSocket


对于实时应用程序而言,使用 WebSocket 的主要优势在于,与传统方式(通过 AJAX 轮询或长轮询)相比,它具有以下的优势:

  • 低延迟:通过维护单一开放连接来实现,这有助于减少数据发送和接收过程中的延迟。它在需要即时发送更新的场景中效果最佳,例如聊天应用或实时交易平台。
  • 实时双向通信:与单向(从客户端到服务器)的 HTTP 不同,WebSocket 允许客户端和服务器随时发送消息。因此,它真正体现了动态性。
  • 降低开销:WebSocket 在初始连接期间仅执行一次握手。此后,双方无需重复 HTTP 请求-响应周期即可发送数据,从而节省带宽并提高效率。


在 PHP 中设置 WebSocket


尽管 PHP 最初的设计目的并不是针对实时应用程序,但使用正确的库和工具在 PHP 中实现 WebSocket 是完全可行的。


1.为PHP安装WebSocket库


Ratchet是 PHP 最流行的 WebSocket 库之一。它为我们提供一个简单、灵活且事件驱动的库,可以轻松实现 WebSocket 通信。


composer require cboden/ratchet

2.构建 WebSocket 服务器


现在,让我们研究如何使用 PHP 和 Ratchet 创建一个基本的 WebSocket 服务器。

require __DIR__ . '/vendor/autoload.php';
use Ratchet\MessageComponentInterface;use Ratchet\ConnectionInterface;
class Chat implements MessageComponentInterface {    protected $clients;
    public function __construct() {        $this->clients = new \SplObjectStorage;    }
    public function onOpen(ConnectionInterface $conn{        // Store the new connection        $this->clients->attach($conn);        echo "New connection! ({$conn->resourceId})\n";    }
    public function onMessage(ConnectionInterface $from$msg{        foreach ($this->clients as $client) {            if ($from !== $client) {                // Send the message to everyone except the sender                $client->send($msg);            }        }    }
    public function onClose(ConnectionInterface $conn{        $this->clients->detach($conn);        echo "Connection {$conn->resourceId} has disconnected\n";    }
    public function onError(ConnectionInterface $conn, \Exception $e{        echo "An error has occurred: {$e->getMessage()}\n";        $conn->close();    }}
$server \Ratchet\Server\IoServer::factory(    new \Ratchet\Http\HttpServer(        new \Ratchet\WebSocket\WsServer(            new Chat()        )    ),    8080);
$server->run();


3.运行服务器


将上述脚本保存为server.php,然后使用 PHP 命令行运行它。

php server.php

这个 WebSocket 服务器将开始监听端口 8080。现在是时候创建一个简单的客户端来与该服务器交互了。

创建 WebSocket 客户端


让我们编写一个简单的 HTML 和 JavaScript 客户端,连接到我们的 PHP WebSocket 服务器。它就像普通用户连接到应用程序一样。


图片


增强WebSocket 服务器


现在,我们已经构建了一个基本的 WebSocket 服务器,但还有几种方法可以改进和扩展它:


  1. 处理更复杂的事件:你可以创建一个系统,其中不同的消息类型(如通知、命令或广播)由你的 WebSocket 服务器以不同的方式处理。
  2. 身份验证:添加身份验证以确保只有授权用户才能连接。这可以通过在 WebSocket 握手期间传递令牌或会话信息来实现。
  3. 使用 Supervisord 或 Docker 进行扩展:如果你计划在生产中部署 WebSocket 服务器,请考虑使用SupervisordDocker等工具来管理和扩展服务器。
  4. 安全 WebSocket (WSS):实施 SSL,使用 wss:// 而非 ws:// 来保护你的 WebSocket 连接。在生产环境中,保护 WebSocket 连接对于保护敏感数据是至关重要的。


结语


WebSocket 支持实时 Web 应用程序。对于需要实时交互的用例(例如聊天应用程序、实时更新或协作工具),WebSocket 是一种非常高效、低延迟的解决方案。


PHP 在 Ratchet 等库的帮助下,现在可以快速构建强大的实时应用程序。

通过进行一些设置并使用正确的工具,你可以将 PHP 与 WebSockets 集成,为你的用户提供更快、更动态的体验!

作者:洛逸

评论