我想在网站上实现一个非常简单的聊天,在2个注册用户和登录用户之间有私人消息(甚至可能是登录用户之间的群组消息)。 以Whatsup为例,当然我没有那么多用户。
资源:Symfony2 + WebsocketBundle
https://github.com/GeniusesOfSymfony/WebSocketBundle
两个问题:
1-您会建议什么样的数据库架构?
2-我如何管理"主题"? (阅读WebsocketBundle教程后,我了解如何订阅/取消订阅/广播主题。但我不知道如何管理用户和主题之间的关系,如何保护对话等等...
我只需要一些关于应用程序逻辑的信息(没有代码)...要保存哪些信息以及在哪里。)
例如,如何管理频道名称(每次都会更改,还是将其存储在数据库中,并在下次用户登录时以某种方式重新使用)?
session.subscribe("acme/channel/id/12345", function(uri, payload){
console.log("Received message", payload.msg);
});
P.S。我已经尝试过搜索SO和Google,但无法找到任何有用的信息。
答案 0 :(得分:1)
WebsocketBundle
为您提供了一种通过套接字进行通信编写的机制。对于聊天/群组聊天设置,您有多种选择。第一个选项可以是使用某些消息传递包并根据需要进行修改。我发现这个包(https://github.com/FriendsOfSymfony/FOSMessageBundle)非常灵活。
但是如果你想在这里开发自己的架构,那么架构的灵感来自FOSMessageBundle的架构以及一些自定义。附加带有表的模式及其列名。可以很容易地从中识别主键和外键。
除Thread
表中thread_group_hash
表中的一个字段外,其余部分非常简单。实际上,该字段的目的是为每个线程提供唯一的散列/密钥。线程意味着一对一聊天或多对多聊天。无论何时有人将人添加到聊天中,用户都将IDs
与他们关联起来。我按升序或降序对添加的用户ID进行排序,并生成md5 / sha1密钥并将其存储在此处。
这也可以用作topic
中的WebSocketBundle
,因为我们正在使用topic
用于我们在此尝试实现的相同目的。每当来自任何一方的对话中添加相同的一组人时,通信将转到相同的线程。但请记住,在插入线程/消息详细信息之前,您需要使用此哈希来识别它所属的位置,或者它是一个新线程:)