WebSocket 库 Ratchet:在 PHP 中实现实时通信

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

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

开始课程

PHP的WebSocket库Ratchet:创建实时应用程序



WebSocket是一种协议,它通过单个持久连接在客户端和服务器之间提供双向通信。与传统的HTTP(每个请求都会打开一个新连接)不同,WebSocket允许实时传输数据而无需延迟。对于PHP,最流行的WebSocket库之一是Ratchet。该库基于ReactPHP构建,并提供了简单而强大的API来创建WebSocket服务器。



什么是Ratchet?



Ratchet是一个开源的PHP库,允许开发者创建实时应用程序,例如聊天、通知、在线游戏和监控系统。它抽象了处理套接字和异步输入/输出的复杂性,提供了方便的类和接口。



Ratchet的主要功能:

  • 支持RFC 6455规范的WebSocket
  • 与HTTP服务器集成(例如通过ReactPHP)
  • 能够创建自定义消息处理器
  • 支持用于发布/订阅的WAMP(WebSocket应用程序消息协议)
  • 轻量级和高性能


安装Ratchet



通过Composer安装该库。在终端中执行:



composer require cboden/ratchet


安装后,您的项目中会出现一个包含必要依赖项(包括ReactPHP)的vendor文件夹。



创建一个简单的WebSocket服务器



让我们看一个基本示例:创建一个接受连接并发送回欢迎消息的服务器。为此,创建一个文件server.php:



<?phprequire 'vendor/autoload.php';

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

class MyWebSocket implements MessageComponentInterface { protected $clients;

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

public function onOpen(ConnectionInterface $conn) { $this->clients->attach($conn); echo "新连接:{$conn->resourceId}"; $conn->send("欢迎!您的ID是:{$conn->resourceId}"); }

public function onMessage(ConnectionInterface $from, $msg) { echo "收到来自{$from->resourceId}的消息:{$msg}"; // 发送给所有客户端 foreach ($this->clients as $client) { if ($from !== $client) { $client->send("来自{$from->resourceId}的消息:{$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(); }}

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

echo "WebSocket服务器已在端口8080上启动...";$server->run();


使用以下命令启动服务器:



php server.php


现在服务器正在监听端口8080。您可以使用任何WebSocket客户端进行测试,例如浏览器扩展或简单的JavaScript代码。



JavaScript客户端部分



创建一个HTML文件client.html:



<!DOCTYPE html><html><head>    <title>WebSocket客户端</title></head><body>    <input type="text" id="message" placeholder="输                    

推荐