使用fd与用户ID的映射表可实现Swoole中WebSocket按用户推送消息,通过全局数组或SwooleTable存储fd↔uid对应关系,在用户登录时绑定,断开时解绑,结合Redis支持多进程或多机部署。

在使用 Swoole 开发 WebSocket 服务时,经常需要为每个连接绑定用户 ID 或别名,以便后续能精准地向特定用户推送消息。Swoole 本身没有内置“别名”或“用户ID”的概念,但你可以通过自定义映射关系来实现这个功能。
1. 使用 fd 与 用户ID 的映射表
Swoole 中每个 WebSocket 连接都有一个唯一的文件描述符 $fd。你可以在用户登录或发送认证消息后,将 $fd 与用户 ID 关联起来,存储在内存或缓存中。
推荐使用 PHP 的 spl_object_storage 或 SwooleTable,但更常见的是用 SwooleCoroutineChannel 配合数组或 Redis 来管理映射。
示例:使用全局数组保存 fd → uid 映射
$server = new SwooleWebSocketServer("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 have 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: $fdn”;});“`
4. 更稳定的方案:使用 SwooleTable
如果服务是多进程模式,普通数组无法跨进程共享。应使用 SwooleTable 实现进程间共享的映射表。
“`php$table = new SwooleTable(1024);$table->column(‘uid’, SwooleTable::TYPE_INT);$table->create();
// 在 onMessage 中绑定$table->set($frame->fd, [‘uid’ => $data[‘uid’]]);
// 根据 uid 查找 fd(需额外结构维护)
注意:Table 以 fd 为主键,若要反查 fd,仍需另一个 Table 或 Redis 协助。
生产环境建议结合 Redis 实现分布式映射,支持多服务器部署。
基本上就这些。核心思路是:用 $fd 作为连接标识,在认证后建立与用户 ID 的双向映射,之后就能按用户 ID 发消息了。
以上就是Swoole怎么给WebSocket连接设置别名或用户ID的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/6682.html
微信扫一扫
支付宝扫一扫