【发布时间】:2016-03-24 19:09:05
【问题描述】:
我已经成功地使用 PHP、JavaScript、AJAX、SQL 建立了一个聊天室并运行良好,但没有使用 JQuery 或其他任何东西。我正在使用会话变量来自动保持用户持久性,即使对于经过的客人也是如此,因为我想要首页上的聊天室。 (如果您好奇,请访问 www.chatbae.com。)
问题是,即使在客人离开房间后,持久的用户记录仍然存在,堆积起来并弄乱了用户列表。
有两个与此问题相关的 SQL 表 -
lastActivity 表(监控每个房间的最后一次活动)和列:
- roomname(此聊天室的名称)
- 计数器(“chatRecords”表中最后一条消息的索引)
- userDT(最后一次添加到用户列表的日期时间)
- parentFolder(服务器上的父文件夹 - 此处不相关)
- isHidden(在房间列表中可见?此处不相关)
activeUsers 表(记录所有聊天室的用户) 相关栏目:
- session_id(用户的唯一会话 ID)
- 用户名(用户名,如果用户是访客则随机)
- isReg(用户注册了吗?)
- roomname(用户所在房间的名称)
- 计数器(从“chatRecords”表收到的最后一条评论的索引)
- userDT(上次为该用户更新用户列表的日期时间)
- roomlistChanged(布尔值;是否通知此用户最近的房间列表 改变?)
- lastActivity(最后评论或更改用户名的日期时间)
activeUsers 表包含问题,因为用户可以通过多种方式离开聊天室而无需明确“告诉我”。
我考虑过设置 Javascript 计时器,以便在用户有一段时间不查询聊天时从聊天中引导用户。 (queryChat 每 3 秒发生一次,以获取新的聊天室 cmets 和其他更新。)但是,此计时器将消失,因为它在客户端,并且客户端将离开房间。
我还考虑将 lastActivity 列绑定到 queryChats 函数,但这意味着每个用户将每 3 秒更新一个表,这听起来不可行。 (我实际上已经尝试过看看会发生什么,但我认为页面冻结了。)
一个可能的可行解决方案是在服务器上设置一个每五分钟重置一次的标志,也许是一个全局 PHP 计时器机制,它检查所有用户并启动那些已经不活动一段时间的用户。
这里的问题是,如果定时器太长,你会在聊天室里有幽灵用户(即已经离开)很长时间,但如果定时器太短,用户会感到沮丧就像他们必须快速交谈以避免被引导。
我只是不确定“真正的”聊天室如何管理用户列表。我是否缺少明显的解决方案?
提前谢谢你!
【问题讨论】:
-
您可以对
activeUsers中的所有用户进行“ping”检查,然后您可以检查用户是否响应或其他什么,如果没有,则将其从数据库中删除。我不知道具体怎么做,但这可以在 jQuery Ajax 和 PHP 中使用。 -
如果您保持持续连接,您将知道用户离开的那一刻。
标签: javascript php ajax