检测用户是否已退出聊天

Detecting If User Has Signed Out Of Chat

本文关键字:退出 聊天 是否 用户 检测      更新时间:2023-09-26

我用PHP/Ajax/MySQL做了一个简单的聊天应用程序。

我经常称这两种方法——

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

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

所以我正在考虑通过重复请求在 Ajax 中实现。但问题是我究竟该怎么做。我是否应该用last_active_time更新参与者表,如果当前时间和该last_active_time之间的差异超过 10 分钟,那么我应该删除用户?这是一个实用的解决方案还是有更好的解决方案?

你有最好的解决方案 IMO。在 Javascript 中创建一个"ping"函数,该函数每分钟/两分钟等执行一次 ping,该浏览器/会话具有唯一的会话 ID。在您的服务器上有一个会话表,并在收到 ping 时更新。使用另一个脚本来查找长时间未被 ping 的条目并关闭会话。

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


编辑:不要使用"setInterval"进行ping,而是在每个ping返回或失败时使用用户"setTimeout"。否则,使用 setInterval,如果您的服务器负载过重,则 ping 队列,永远不要响应并排队更多。由于使用了所有服务器套接字,因此服务器崩溃,然后您无法通过 ssh 连接来修复它......没有一刻我感到骄傲。

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

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