首页 > php框架 > Swoole > 正文

Swoole怎么给WebSocket连接设置别名或用户ID

穿越時空
发布: 2025-10-12 10:05:01
原创
220人浏览过
使用fd与用户ID的映射表可实现Swoole中WebSocket按用户推送消息,通过全局数组或Swoole\Table存储fd↔uid对应关系,在用户登录时绑定,断开时解绑,结合Redis支持多进程或多机部署。

swoole怎么给websocket连接设置别名或用户id

在使用 Swoole 开发 WebSocket 服务时,经常需要为每个连接绑定用户 ID 或别名,以便后续能精准地向特定用户推送消息。Swoole 本身没有内置“别名”或“用户ID”的概念,但你可以通过自定义映射关系来实现这个功能。

1. 使用 fd 与 用户ID 的映射表

Swoole 中每个 WebSocket 连接都有一个唯一的文件描述符 $fd。你可以在用户登录或发送认证消息后,将 $fd 与用户 ID 关联起来,存储在内存或缓存中。

推荐使用 PHP 的 spl_object_storageSwoole\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 找到对应的连接并发送消息。

NameGPT名称生成器
NameGPT名称生成器

免费AI公司名称生成器,AI在线生成企业名称,注册公司名称起名大全。

NameGPT名称生成器0
查看详情 NameGPT名称生成器

例如,你想给用户 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: $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(需额外结构维护)

<p>注意:Table 以 fd 为主键,若要反查 fd,仍需另一个 Table 或 Redis 协助。</p>

<p>生产环境建议结合 Redis 实现分布式映射,支持多服务器部署。</p>

基本上就这些。核心思路是:用 $fd 作为连接标识,在认证后建立与用户 ID 的双向映射,之后就能按用户 ID 发消息了。
登录后复制

以上就是Swoole怎么给WebSocket连接设置别名或用户ID的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号