检测用户是否已退出聊天

时间:2012-06-21 10:35:37

标签: php javascript ajax jquery

我在PHP / Ajax / MySQL中创建了一个简单的聊天应用程序。

我经常调用这两种方法 -

setInterval("GetChatParticipants()",5000);
setInterval("GetChatMessages()",1000);

现在根据客户端设计,没有Logout或Sign Out按钮,所以我想检测用户什么时候关闭浏览器,那时我必须从数据库中删除参与者记录。我不想使用onbeforeunload,因为Chrome拒绝接受关于窗口卸载事件的Ajax请求。

所以我想通过重复请求在Ajax中实现。但问题是我该如何做到这一点。我应该使用last_active_time更新参与者表格,如果当前时间与last_active_time之间的差异超过10分钟,那么我应该删除用户吗?这是一个实用的解决方案还是可以有更好的解决方案?

3 个答案:

答案 0 :(得分:1)

是的,这是一个实用的解决方案,然后只有一个你可以依赖,所以,无论你使用什么,除此之外,这一次最终检查应始终在你的逻辑中。据说,结合多种方法将为您提供更多检测用户提前离开的可能性。为支持它的浏览器添加onbeforeunload。为来自不安全位置的客户端添加“注销”按钮,这些客户端在离开PC时要立即注销,最后检查是否不活动。

答案 1 :(得分:1)

你有最好的解决方案IMO。在Javascript中创建一个“ping”函数,使用该浏览器/会话特有的会话ID每分钟/两分钟等。在服务器上有一个会话表,并在ping时进行更新。有另一个脚本可以查找长时间没有被ping的条目并关闭会话。

我已经在一个站点上为数千个并发用户运行了这个结构,当负载变得很重时,我不得不将ping从1分钟降低到每2分钟(这是在2个负载平衡的服务器上运行其余的该网站也)。很明显,你的ping时间大约是超时时间的45%(所以如果一个失败,那么第二个应该命中)。这是一个可以处理负载的简单过程。


编辑:不要对ping使用“setInterval”,而是在每次ping返回或失败时使用“setTimeout”。否则,使用setInterval,如果您的服务器加载太多,那么ping队列,永远不会响应并排队更多。当使用所有服务器套接字时,你的服务器崩溃,然后你无法通过ssh连接来修复它......不是我感到自豪的那一刻。

答案 2 :(得分:1)

是的,这是实际的解决方案。唯一的区别是存储有关用户ping的信息的位置。您可以在数据库或键值存储中执行此操作,如memcached。我更喜欢第二个,因为我认为它需要较少的资源。