Hyperf 集成 WebSocket 简单高效:需在 server.php 中配置 websocket 类型服务,编写继承 WebSocketController 的处理器并用 @OnOpen/@OnMessage/@OnClose 注解方法,通过 Redis 管理用户 fd 实现广播,前端用 ws:// 协议连接并注意生产环境 Nginx 代理配置。

Hyperf 中集成 WebSocket 很简单,核心是定义 WebSocket 服务器、注册处理器、处理连接与消息。不需要额外装复杂组件,框架原生支持。
启用并配置 WebSocket 服务器
Hyperf 默认不开启 WebSocket 服务,需手动在 config/autoload/server.php 中添加一个 websocket 类型的 server 配置:
- 指定
type为websocket - 设置监听 host 和 port(如
0.0.0.0:9502) - 推荐关闭
enable_coroutine(WebSocket 连接本身已是协程安全,开启可能引发意外行为) - 可选配置
settings,例如'websocket_compression' => true启用压缩
编写 WebSocket 控制器(消息处理器)
创建一个类继承 Hyperf\WebSocketServer\Annotation\WebSocketController,用注解标记为 WebSocket 处理器:
- 用
@OnMessage注解方法,接收客户端发来的消息(参数为Frame $frame) - 用
@OnOpen注解方法,在连接建立时触发(可获取 fd、request 等信息,适合做鉴权或存用户映射) - 用
@OnClose注解方法,在连接断开时清理资源(如从内存中移除 fd) - 方法内可通过
$this->sender->send($fd, $data)向指定客户端回传数据
注意:控制器方法必须是 public,且不能有构造函数依赖注入(框架通过反射实例化,建议用属性注入或 make() 获取依赖)。
广播与用户管理(进阶实用技巧)
Hyperf 不内置房间/广播机制,但很容易自己实现:
- 用
Hyperf\Contract\StdoutLoggerInterface或Redis存储在线用户 fd 列表(推荐 Redis,支持多实例共享) - 在
@OnOpen中校验 token,解析用户 ID,存入redis.hSet('ws:users', $fd, $uid) - 发送广播时,遍历所有在线 fd(
redis.hGetAll('ws:users')),逐个调用sender->send() - 避免直接用 PHP 数组存 fd——单机可用,集群部署必须用 Redis 或其他共享存储
前端连接与调试小提醒
客户端用原生 WebSocket 即可连接,URL 格式为 ws://your-domain:9502(HTTP 用 ws://,HTTPS 用 wss://):
- 连接后立即触发
@OnOpen,此时可发欢迎消息或要求传 token - 服务端返回的数据必须是字符串(JSON 推荐),前端需
JSON.parse()解析 - 开发时用 Chrome 控制台的
new WebSocket('ws://127.0.0.1:9502')快速测试 - 生产环境务必加 Nginx 反向代理,并配置
Upgrade和Connection头










