3

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

我经常调用这两种方法-

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

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

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

4

3 回答 3

1

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

于 2012-06-21T10:41:53.950 回答
1

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

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


编辑:不要对 ping 使用“setInterval”,而是在每个 ping 返回或失败时使用“setTimeout”。否则,使用 setInterval,如果您的服务器负载过大,则 pings 队列,永远不会响应并排队更多。由于使用了所有服务器套接字,因此服务器崩溃了,然后您无法通过 ssh 连接来修复它……这不是我引以为豪的时刻。

于 2012-06-21T10:44:09.493 回答
1

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

于 2012-06-21T10:50:49.627 回答