检测在线用户?

15

我不确定最简单的方法是什么。我需要能够检测出谁在我的网站上线。所以当人们查看帖子或其他内容时,它将在用户的名称旁边显示他们是否在线。在论坛首页底部,它将显示所有在线用户。

要实现这样的功能,最简单的方法是什么?我不确定是否需要一个JavaScript来每次加载页面时运行。

谢谢 :)


3
不要使用 JavaScript 来做这件事。 - drudge
你使用的是哪个论坛和版本?如果像IBP / InvisionFree或PHPBB这样的预制品,则此功能通常已经存在于您的论坛控制面板中。 - rlb.usa
3
我正在自行编写论坛程序。 :) - Cory
4个回答

25
  • 拥有一个MySQL数据库,里面有一个用户表
  • 在该用户表中有一个保存“最后活跃时间”的列
  • 在每个页面请求时更新该列
  • 当检查在线或离线状态时,检查当前时间减去“最后活跃时间”是否大于您喜欢的某个阈值

编辑:如果您希望已打开您网站但处于空闲状态的用户也被显示为在线,可以选择使用JavaScript “ping”服务器(请求一个空白页面)每两分钟左右一次。


1
是的,这可能是最好的方法。 - Breezer
2
关于这个解决方案的编辑:如果您决定ping服务器以跟踪“谁在线”,则可以考虑更新pinger的“最后查看”条目以反映此情况。这样做有利有弊:它将防止空闲的人也超时其“最后查看”,但它也将允许人们走开一个打开的浏览器并继续出现在线,即使他们不在。由您选择。 - Brian Bauman
如果您具有 shell 管理员访问权限,可以每隔 - 例如 5 分钟 - 运行 cron 脚本来组合自上次运行 cron 以来一直处于活动状态的用户数组,然后将其写入平面文本文件并将其作为变量包含在标头中,这样您就不需要使用昂贵的查询不断地向服务器发送请求。 - Kai Qing
@Cory:给每个客人一个带有随机长字符串的cookie,并创建一个新表格,其中包含该字符串作为ID和时间戳(每次客人请求页面时更新)。为避免浪费磁盘空间,您应定期删除旧的数据库条目。 - thejh
我会使用cURL进行JavaScript ping示例,没有人会注意到它,应该像机器人一样工作。 - Pedro Gabriel
显示剩余6条评论

3

2

你需要维护一个“会话”表,其中包含用户和他们访问页面的时间。

如果用户上次访问时间超过5分钟,则认为用户已离线(并且可以删除该行)。在会话表中的其他用户则被视为“在线”。


0

首先,没有办法准确地获取当前在线用户数。你能做的最好的事情就是得到一个大概的数字。

想象一下这种情况:一个用户登录到你的网站,点击一些链接,然后只是关闭浏览器标签页而没有退出登录。实际上这很常见。你的服务器永远不知道用户关闭了浏览器,所以如果会话存储在你的服务器上,那么该用户的会话将保持活动状态一段时间(可能是30分钟)。

在一些无状态的Web应用程序中,比如Ruby on Rails应用程序,会话完全存储在浏览器端(在cookie中),每次请求后服务器完全忘记了用户,这使得计算在线用户数量几乎是不可能的。这是简单性和可扩展性之间的权衡。

那么我们怎么才能得到这样的数字呢?我们必须基于妥协做出假设。我们假设如果一个用户最后的请求时间小于30分钟,他/她就在线,然后通过跟踪每个用户最后请求的时间戳,我们可以得到“在线”用户的数量。或者我们可以假设如果一个用户在服务器上的会话仍然存活,他/她就在线,并计算服务器上的会话数。无论哪种方式,我们都必须确信“悬空会话”的数量是可忽略的(我知道这很难)。


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