Swoole怎么给WebSocket连接设置别名或用户ID
发布时间 - 2025-10-12 00:00:00 点击率:次使用fd与用户ID的映射表可实现Swoole中WebSocket按用户推送消息,通过全局数组或Swoole\Table存储fd↔uid对应关系,在用户登录时绑定,断开时解绑,结合Redis支持多进程或多机部署。
在使用 Swoole 开发 WebSocket 服务时,经常需要为每个连接绑定用户 ID 或别名,以便后续能精准地向特定用户推送消息。Swoole 本身没有内置“别名”或“用户ID”的概念,但你可以通过自定义映射关系来实现这个功能。
1. 使用 fd 与 用户ID 的映射表
Swoole 中每个 WebSocket 连接都有一个唯一的文件描述符 $fd。你可以在用户登录或发送认证消息后,将 $fd 与用户 ID 关联起来,存储在内存或缓存中。
推荐使用 PHP 的 spl_object_storage 或 Swoole\Table,但更常见的是用 Swoole\Coroutine\Channel 配合数组或 Redis 来管理映射。
示例:使用全局数组保存 fd → uid 映射
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
// 存储 fd 到 uid 的映射
$fdToUid = [];
$uidToFd = [];
$server->on('open', function ($server, $req) use (&$fdToUid, &$uidToFd) {
echo "Connection open: {$req->fd}\n";
});
$server->on('message', function ($server, $frame) use (&$fdToUid, &$uidToFd) {
$data = json_decode($frame->data, true);
// 假设客户端发送 {type: 'login', uid: 123}
if ($data['type'] === 'login') {
$uid = $data['uid'];
$fd = $frame->fd;
// 绑定关系
$fdToUid[$fd] = $uid;
$uidToFd[$uid] = $fd;
$server->push($fd, json_encode(['msg' => "Logged in as user {$uid}"]));
}
// 其他消息处理...
});2. 推送消息给指定用户
有了 $uid → $fd 的映射,就可以通过用户 ID 找到对应的连接并发送消息。
例如,你想给用户 ID 为 1001 的用户发通知:
```php $targetUid = 1001; if (isset($uidToFd[$targetUid])) { $server->push($uidToFd[$targetUid], json_encode(['msg' => 'You ha
ve a new message!']));
}
```
3. 处理连接断开时的清理
当用户断开连接时,务必清除映射,避免无效引用。
```php $server->on('close', function ($server, $fd) use (&$fdToUid, &$uidToFd) { if (isset($fdToUid[$fd])) { $uid = $fdToUid[$fd]; unset($uidToFd[$uid]); unset($fdToUid[$fd]); } echo "Connection closed: $fd\n"; }); ```4. 更稳定的方案:使用 Swoole\Table
如果服务是多进程模式,普通数组无法跨进程共享。应使用 Swoole\Table 实现进程间共享的映射表。
```php $table = new Swoole\Table(1024); $table->column('uid', Swoole\Table::TYPE_INT); $table->create();// 在 onMessage 中绑定 $table->set($frame->fd, ['uid' => $data['uid']]);
// 根据 uid 查找 fd(需额外结构维护)
注意:Table 以 fd 为主键,若要反查 fd,仍需另一个 Table 或 Redis 协助。
生产环境建议结合 Redis 实现分布式映射,支持多服务器部署。
基本上就这些。核心思路是:用 $fd 作为连接标识,在认证后建立与用户 ID 的双向映射,之后就能按用户 ID 发消息了。
# php
# redis
# js
# json
# websocket
# swoole
# red
# echo
# if
# 并发
# channel
# function
# column
# table
# 绑定
# 用户登录
# 的是
# 都有
# 你可以
# 就能
# 推荐使用
# 可以通过
# 自定义
# 但你
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何撰写建站申请书?关键要点有哪些?
Laravel如何使用Blade模板引擎?(完整语法和示例)
北京企业网站设计制作公司,北京铁路集团官方网站?
Python文件异常处理策略_健壮性说明【指导】
QQ浏览器网页版登录入口 个人中心在线进入
JavaScript常见的五种数组去重的方式
如何为不同团队 ID 动态生成多个独立按钮
怎么用AI帮你设计一套个性化的手机App图标?
网站优化排名时,需要考虑哪些问题呢?
Python文件操作最佳实践_稳定性说明【指导】
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
利用 Google AI 进行 YouTube 视频 SEO 描述优化
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
再谈Python中的字符串与字符编码(推荐)
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
如何在景安服务器上快速搭建个人网站?
Python进程池调度策略_任务分发说明【指导】
Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】
Bootstrap整体框架之JavaScript插件架构
如何快速查询网址的建站时间与历史轨迹?
如何在IIS中新建站点并配置端口与IP地址?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
昵图网官网入口 昵图网素材平台官方入口
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
太平洋网站制作公司,网络用语太平洋是什么意思?
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程
Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】
,在苏州找工作,上哪个网站比较好?
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
谷歌Google入口永久地址_Google搜索引擎官网首页永久入口
潮流网站制作头像软件下载,适合母子的网名有哪些?
LinuxCD持续部署教程_自动发布与回滚机制
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Java遍历集合的三种方式
通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
Python文件流缓冲机制_IO性能解析【教程】
Laravel的契約(Contracts)是什么_深入理解Laravel Contracts与依赖倒置
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
Laravel如何获取当前登录用户信息_Laravel Auth门面使用与Session用户读取【技巧】
实现点击下箭头变上箭头来回切换的两种方法【推荐】
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框
JavaScript如何操作视频_媒体API怎么控制播放
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
python中快速进行多个字符替换的方法小结
详解jQuery停止动画——stop()方法的使用

