用于 PHP WebSocket 的 Ratchet 库
在现代 Web 开发中,越来越需要实时数据交换:聊天、通知、在线游戏、文档协同编辑。传统的 HTTP 不适合此类任务,因为它基于“请求-响应”模式。而 WebSocket 协议则提供了帮助,它在客户端和服务器之间建立持久的双向连接。
对于 PHP 来说,最流行且成熟的 WebSocket 库之一是 Ratchet。它提供了便捷的 API 来创建能够处理大量并发连接的 WebSocket 服务器。在本文中,我们将详细介绍如何安装 Ratchet、编写简单的服务器和客户端,并探讨典型的使用场景。
什么是 Ratchet?
Ratchet 是一个基于 ReactPHP(异步事件循环)编写的 PHP 库。它允许创建实时运行的 WebSocket 服务器,而无需额外的模块(如 ext-sockets 或 ext-event)。该库支持 RFC 6455(WebSocket)标准,并且可以轻松集成到任何 PHP 应用程序中。
Ratchet 的主要功能:
- 支持 WebSocket 协议(版本 13 及以下)。
- 能够创建自定义控制器来处理消息。
- 内置支持 WAMP(WebSocket 应用程序消息协议),用于发布/订阅(pub/sub)和远程过程调用(RPC)。
- 通过单独的包轻松集成到框架中(Laravel、Symfony)。
- 由于 ReactPHP 的异步架构,具有高性能。
安装 Ratchet
通过 Composer 进行安装。为此,在项目根目录下执行以下命令:
composer require cboden/ratchet安装后,您的项目中会出现一个包含该库及其依赖项(包括 ReactPHP)的 vendor 目录。请确保您已安装 PHP 7.1 或更高版本。
创建一个简单的 WebSocket 服务器
让我们编写一个简单的服务器,它接收来自客户端的消息并将其发送回去(回声服务器)。创建文件 server.php:
<?phprequire __DIR__ . '/vendor/autoload.php';
use Ratchet\\MessageComponentInterface;use Ratchet\\ConnectionInterface;use Ratchet\\Server\\IoServer;use Ratchet\\Http\\HttpServer;use Ratchet\\WebSocket\\WsServer;
class EchoServer implements MessageComponentInterface { public function onOpen(ConnectionInterface $conn) { echo "新连接: {$conn->resourceId}"; }
public function onMessage(ConnectionInterface $from, $msg) { echo "收到来自 {$from->resourceId} 的消息: {$msg}"; // 将消息发送回发送者 $from->send("回声: {$msg}"); }
public function onClose(ConnectionInterface $conn) { echo "连接 {$conn->resourceId} 已关闭"; }
public function onError(ConnectionInterface $conn, \\Exception $e) { echo "错误: {$e->getMessage()}"; $conn->close(); }}
// 在端口 8080 上启动服务器$server = IoServer::factory( new HttpServer( new WsServer( new EchoServer() ) ), 8080);
echo "WebSocket 服务器已在端口 8080 上启动";$server->run();使用命令 php server.php 启动服务器。它将监听端口 8080 上的传入 WebSocket 连接。
创建客户端 (JavaScript)
为了测试,创建一个包含 JavaScript 客户端的简单 HTML 文件:
<!DOCTYPE html><html><head> <title>WebSocket 客户端</title></head><body