PHP上的WebSocket:从零构建实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

WebSocket 在 PHP 中的介绍:从理论到实践



现代 Web 应用程序越来越需要客户端和服务器之间的即时数据传输。基于长轮询或周期性 AJAX 请求的传统 HTTP 请求-响应循环,已无法再处理实时任务。这时,WebSocket 协议应运而生——这是一种允许在浏览器和服务器之间建立永久双向连接的技术。



在本文中,我们将探讨如何使用 WebSocket 在 PHP 中创建实时应用程序。您将学习如何安装 Ratchet 服务器库、编写简单的聊天和通知系统,以及会遇到哪些陷阱。本材料面向熟悉 PHP 和 JavaScript 基础的开发人员。



什么是 WebSocket,为什么它对 PHP 很重要?



WebSocket 是一种基于 TCP 工作的协议。它起始于一个 HTTP 请求(握手),之后连接被“升级”为全双工通道。与 HTTP 不同:



  • 服务器无需预先请求即可向客户端发送数据。
  • 连接保持打开状态,节省了重复握手的资源。
  • 数据传输延迟最小——毫秒级,而长轮询则为秒级。


PHP 传统上被认为是一种不适合实时任务的语言,因为它采用“一个请求——一个进程”的模型。然而,像 Ratchet 和 ReactPHP 这样的现代库允许运行长期存在的 PHP 进程,这些进程可以作为独立的 WebSocket 服务器工作。这为以下应用打开了可能性:



  • 在线聊天和即时通讯工具。
  • 通知系统(新邮件、订单、提醒)。
  • 协同文档编辑。
  • 游戏和交易平台。


使用 Ratchet 在 PHP 中安装和配置 WebSocket 服务器



为了在 PHP 中处理 WebSocket,我们将使用 Ratchet 库(基于 ReactPHP)。通过 Composer 进行安装。



步骤 1. 创建项目并安装依赖



mkdir websocket-phpcd websocket-phpcomposer require cboden/ratchet


安装后,Ratchet 和 ReactPHP 将出现在 vendor 文件夹中。



步骤 2. 创建 WebSocket 服务器类



创建一个文件 server.php:



<?phpuse Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;

class ChatServer implements MessageComponentInterface { protected $clients;

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

public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "新连接: {$conn->resourceId}"; }

public function onMessage(ConnectionInterface $from, $msg) { foreach ($this->clients as $client) { if ($from !== $client) { $client->send($msg); } } }

public function onClose(ConnectionInterface $conn) { $this->clients->detach($conn); echo "断开连接: {$conn->resourceId}"; }

public function onError(ConnectionInterface $conn, \\Exception $e) { echo "错误: {$e->getMessage()}"; $conn->close(); }}


步骤 3. 启动服务器



将启动代码添加到 server.php:



use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;

require __DIR__ . '/vendor/autoload.php';

$server = IoServer::factory( new HttpServer( new WsServer( new ChatServer() ) ), 8080);

echo "WebSocket 服务器已在端口 8080 上启动";$se

博客

书籍推荐