在进行一些研究时,我发现SO使用websockets进行聊天和消息收件箱通知(有一些redis的混合)。我想实现类似的系统,我刚刚开始使用websockets并坚持选择最佳方法。
我已经达成了以下策略。一旦用户登录,我将为他打开一个连接。
public function onOpen(ConnectionInterface $conn)
{
//add user to the database or data structure
}
我正在考虑在后端为每个用户提供他唯一的ID(注册ID),以便我可以唯一地识别用户。
Q.1如何使用
ConnectionInterface
对象存储此额外ID信息,以便在发送消息时,我可以参考特定用户的连接,并且可以将消息路由到所选用户,例如ID = 20
foreach ($this->clients as $client) {
if($client->id == $receiver_id)
$client->send($msg);
}
例如,当具有ID 43,44和78的用户正在聊天,并且43被发送到54& 78,除了发件人本身,我可以向聊天室的所有人发送消息。这样也可以处理私人聊天,因为那时只有两个用户。
Q.2其次,我应该在后端维护像堆这样的本地数据结构来存储聊天室ID和相应用户的信息,还是使用redis。哪一个更可靠,性能更好(我对redis一无所知,只知道SO使用,所以需要在将时间投入redis之前清除)
问题3如何在客户端识别聊天消息和收件箱通知,因为从服务器我可以直接发送消息。
我已经将此解决方案视为发送标识符标记,例如0 - 聊天,1-inbox警报2 - 声誉更改等。这种方法是否正确?
Q.4用户可能同时打开两个或多个聊天室。我如何区分beckend?
我想到了这一点,因为每个聊天室都会有唯一的标识符字符串,每次都会与消息一起发送并使用此字符串,我可以在后端识别正确的聊天室,消息应该发布到该聊天室这种方法是否正确?
Q.5如果对Q.2的回答是redis,我可以并行使用Redis和Mysql吗?