检测用户是否已退出聊天
Detecting If User Has Signed Out Of Chat
我用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)中执行此操作。我更喜欢第二个,因为我认为它需要更少的资源。
- Ajax聊天消息重复而不仅仅是更新
- 弹出窗口出现,然后退出
- 在不打开聊天屏幕的情况下制作Zopim-ding代理
- 退出全屏不起作用
- 基于两个条件退出While循环
- WebRTC视频聊天可以在FF中使用,但不能在Chrome中使用
- 角度p2p视频聊天-远程流是黑视频
- 如何准确执行加载脚本&退出弹出窗口
- firefox插件:退出不工作的应用程序观察器
- Nodejs私有消息/w”;在聊天中
- 无法执行文件.退出Acrobat PDF中的操作
- XHR不适用于聊天应用程序
- 我正在创建一个聊天,但每次我发送消息时,它都不会让我再发送另一条消息,就像表格一样;不起作用
- 如何从Node Webkit应用程序中退出外部CMD文件
- Backbone fetch中的Ajax在fetch调用退出后完成,因此fetch调用中没有成功/失败事件
- 如何在不退出javascript的情况下从javascript更新网页
- javascript在退出时打开窗口url
- 如何使用Socket.io和Node.js开发大型聊天应用程序
- 检测用户是否已退出聊天
- Javascript的方式与StropheJS干净的退出,当你关闭聊天窗口