swoole版本:1.9.2
需求: 类似直播的评论功能, 比如A房间下面显示A房间的评论 B房间下面显示B房间的评论.... 这个应该是个正常的需求吧.. 但是我现在发现一个问题, 就是 消息是发给所有在线链接者.. 就是相当于A下面的评论在 BCDEF 都能看到.. 这就很蛋疼了... 不知道啥问题.. 求各位大哥大姐帮帮忙看看. 公司很急呀
代码如下:
<?php
$ws = new Swoole\Websocket\Server("0.0.0.0", 9508);
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
$fd = $request->fd;
echo "client-{$fd} is connect\n";
//$ws->push($request->fd, "hello, welcome\n");
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
// $msg = 'from'.$frame->fd.":{$frame->data}\n";
// $data = htmlentities(htmlspecialchars($frame->data));
// if(mb_strlen($data,'utf8')>30){
// $data = mb_substr($data, 0,30,'utf-8').'...';
// }
$data = json_decode($frame->data,true);
//判断是否有礼物
if($data['gift']){
$gift = json_decode($data['gift'],true);
$arr = array(
'info' => $data['info'],
'uid' => $data['uid'],
'username' =>$data['username'],
'imageSrc' =>$gift['img'],
'number' =>$gift['number'],
);
}else{
// 正常发送
$arr = array(
'info' => $data['info'],
'uid' => $data['uid'],
'username' =>$data['username'],
'href' => 'javascript:void(0);',
'status' => 1
);
}
$msg = json_encode($arr);
foreach($ws->connections as $fd) {
//发送信息
$ws->push($fd, $msg);
}
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
echo "client-{$fd} is closed\n";
});
$ws->start();
发送到指定的人,必须知道指定的人的fd,可以在用户登录的时候将uid和fd做个关联存到redis或者swoole_table等其他共享内存中,通过uid找到fd进而push到这个fd上。
你看你代码中的
其中
$ws->connections
是获取所有的文件描述符,你如果要A直播间能看到A的评论,B能看到B的评论,你应该对fd进行分组,诸如使用redis将所有在A直播间下的fd保存到一个集合中。在A直播间下进行的评论,只取出A直播间下的fd.举个例子,伪代码:
给A直播间下的人发送消息