检测用户是否已经退出聊天

3

我已经用PHP/Ajax/MySQL制作了一个简单的聊天应用程序。

我经常调用这两种方法-

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

根据客户的设计,没有注销或退出按钮,所以我想在用户关闭浏览器时检测,并在那时从数据库中删除参与者记录。我不想使用 onbeforeunload,因为Chrome拒绝接受窗口卸载事件上的Ajax请求。
所以我考虑通过发出重复的请求来实现Ajax。但问题是我该如何实施。我应该使用last_active_time更新参与者表吗?如果当前时间和last_active_time之间的差异超过10分钟,那么我应该删除该用户吗?这是一个切实可行的解决方案还是有更好的解决方案?
3个回答

1

是的,这是一个实用的解决方案,也是您唯一可以依赖的解决方案,因此,无论您在此之外使用什么,这个最终检查应始终包含在您的逻辑中。话虽如此,结合几种方法将为您提供更多检测用户早期离开的可能性。对于支持它的浏览器,请添加onbeforeunload。为从不安全位置进入并希望立即注销的客户添加“注销”按钮,最后,检查不活动状态。


1

在我看来,你有最好的解决方案。使用Javascript创建一个“ping”函数,每分钟/两分钟等使用唯一于该浏览器/会话的会话ID进行ping。在服务器上拥有一个会话表,并在收到ping时进行更新。再编写另一个脚本,查找长时间未被ping的条目并关闭会话。

我曾经在一个站点上运行了这个结构,同时有数千个并发用户,当负载变得较重时,我不得不将ping间隔从1分钟降低到每2分钟(这是在2个负载平衡服务器上运行其余站点时)。显然,你需要使ping时间约为超时时间的45%(因此如果一个失败,第二个应该命中)。这是一个可以处理负载的简单过程。


编辑:不要使用“setInterval”进行ping,而是在每个ping返回或失败时使用“setTimeout”。否则,如果您的服务器负载过高,则ping队列将永远不会响应并且会继续排队。当所有服务器套接字都被使用时,服务器会崩溃,然后您无法通过ssh连接进行修复...这不是我引以为豪的时刻。

此外,我仍然会在服务器上设置一个注销功能,当浏览器关闭/离开当前页面时,使用JavaScript触发该功能... 这里应该有相应的事件。但是如果他们想像Stackoverflow一样,在关闭浏览器后让人们在频道中停留一段时间,以避免意外关闭浏览器对聊天会话产生影响,最好不要这样做 :) - sinni800

1

是的,这是一个实用的解决方案。唯一的区别在于存储有关用户 ping 的信息的位置。您可以将其存储在数据库中或类似 memcached 的键值存储中。我更喜欢第二种方法,因为我认为它需要更少的资源。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接