【问题标题】:PHP/AJAX/SQL - how to keep chatroom userlist updated reliably, feasibly?PHP/AJAX/SQL - 如何可靠、可行地更新聊天室用户列表?
【发布时间】:2016-03-24 19:09:05
【问题描述】:

我已经成功地使用 PHP、JavaScript、AJAX、SQL 建立了一个聊天室并运行良好,但没有使用 JQuery 或其他任何东西。我正在使用会话变量来自动保持用户持久性,即使对于经过的客人也是如此,因为我想要首页上的聊天室。 (如果您好奇,请访问 www.chatbae.com。)

问题是,即使在客人离开房间后,持久的用户记录仍然存在,堆积起来并弄乱了用户列表。

有两个与此问题相关的 SQL 表 -


lastActivity 表(监控每个房间的最后一次活动)和列:

  • roomname(此聊天室的名称)
  • 计数器(“chatRecords”表中最后一条消息的索引)
  • userDT(最后一次添加到用户列表的日期时间)
  • parentFolder(服务器上的父文件夹 - 此处不相关)
  • isHidden(在房间列表中可见?此处不相关)

activeUsers 表(记录所有聊天室的用户) 相关栏目:

  • session_id(用户的唯一会话 ID)
  • 用户名(用户名,如果用户是访客则随机)
  • isReg(用户注册了吗?)
  • roomname(用户所在房间的名称)
  • 计数器(从“chatRecords”表收到的最后一条评论的索引)
  • userDT(上次为该用户更新用户列表的日期时间)
  • roomlistChanged(布尔值;是否通知此用户最近的房间列表 改变?)
  • lastActivity(最后评论或更改用户名的日期时间)

activeUsers 表包含问题,因为用户可以通过多种方式离开聊天室而无需明确“告诉我”。

我考虑过设置 Javascript 计时器,以便在用户有一段时间不查询聊天时从聊天中引导用户。 (queryChat 每 3 秒发生一次,以获取新的聊天室 cmets 和其他更新。)但是,此计时器将消失,因为它在客户端,并且客户端将离开房间。

我还考虑将 lastActivity 列绑定到 queryChats 函数,但这意味着每个用户将每 3 秒更新一个表,这听起来不可行。 (我实际上已经尝试过看看会发生什么,但我认为页面冻结了。)

一个可能的可行解决方案是在服务器上设置一个每五分钟重置一次的标志,也许是一个全局 PHP 计时器机制,它检查所有用户并启动那些已经不活动一段时间的用户。

这里的问题是,如果定时器太长,你会在聊天室里有幽灵用户(即已经离开)很长时间,但如果定时器太短,用户会感到沮丧就像他们必须快速交谈以避免被引导。

我只是不确定“真正的”聊天室如何管理用户列表。我是否缺少明显的解决方案?

提前谢谢你!

【问题讨论】:

  • 您可以对activeUsers 中的所有用户进行“ping”检查,然后您可以检查用户是否响应或其他什么,如果没有,则将其从数据库中删除。我不知道具体怎么做,但这可以在 jQuery Ajax 和 PHP 中使用。
  • 如果您保持持续连接,您将知道用户离开的那一刻。

标签: javascript php ajax


【解决方案1】:

使用您当前的架构,最好的方法是结合使用前端计时器和后端活动时间过滤器。

您需要在前端设置一个计时器,每 3 到 5 秒对服务器执行一次 ping 操作(根据您需要的“准确度”进行调整,ping 之间的时间越长越好)。将当前时间存储为用户上次活动(如果上次活动在您的应用中意味着更具体的内容,则创建一个新列),并发送回活跃用户列表以保持最新。

在后端,只需对任何“活跃用户”类型的查询进行过滤,以过滤掉过去 5 秒内未 ping 过的任何人。

您可以每分钟使用一次 crontab 任务从任何活动用户表中删除死用户(因此您的过滤器必须进行较少的过滤),或者使用肮脏的 if(mt_rand(0,100) === 42) 技巧每隔一段时间在您的内部运行一次清理pinger 脚本。

显然,您不会获得真正的聊天应用程序的性能,但您可以做一些明显的事情来提高其性能。

注意:基本级别的“真实”聊天应用程序在许多 同样,他们只是从拥有 websocket 中获得性能优势 并且通常是这种类型的更好的语言选择 应用。如果他们的前端应用程序也受到幽灵用户的影响 不优雅地关闭,不得不依赖 pings

【讨论】:

    【解决方案2】:

    也许您可以在客户端上使用 Javascript 以间隔 WindowTimers.setInterval() 验证活动: JavaScript Interval() 验证您的上次活动值并将其与当前时间进行比较。最后,在服务器端有一个 PHP 方法,如果 WindowTimers.setInterval() 在某个时间窗口内没有发送响应,它肯定会引导用户

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-17
      • 1970-01-01
      相关资源
      最近更新 更多