确定用户是否在线的最简单方法是什么?(PHP/MYSQL)

IT技术 php javascript mysql offline
2021-03-17 12:03:50

有没有办法可以通过会话来了解用户是否在线?

即:使用登录,我设置了一个 $_SESSION 变量,用户超时 cookie 垃圾收集器更新数据库以更新其状态为离线。

EDIT:我想要一个不涉及时间或日期的解决方案。我想要一些骑在会议或类似的东西。猜测是否有人在线不足以满足我的需求。

6个回答

不要费心弄清楚时区之间的差异。那没有必要。

每当用户访问页面时,更新用户表上次更新时间记录中的字段。然后查询在过去 5 分钟内具有最后更新时间的所有用户。除此之外的任何东西,它们都被视为“离线”。

如果您使用服务器时间,通过 MySQL 中的 NOW() 函数,您将回避计算时区之间的差异。

这是跟踪当前在线用户数量的标准方法(意思是,在过去几分钟内处于活动状态)。

不断更新

如果您想知道即使它们没有在页面之间跳转,它们仍然处于活动状态,请包含一些 javascript 以每 60 秒左右 ping 您的服务器,让您知道它们仍然存在。它的工作方式与我最初的建议相同,但它会更新您的记录,而无需他们至少每五分钟疯狂浏览一次您的网站。

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);
你会在 DB 的时间戳上放一个索引吗?
2021-05-10 12:03:50
我一直在有类似问题的网站海洋中徘徊,而您是第一个给出满意答案的人。非常感谢你。
2021-05-12 12:03:50
我正在考虑在我自己的网站上使用这种方法,但是注释部分 /* XHR back to server Example uses jQuery */ 让我有点困惑,这是否只是执行一个 php 脚本来更新用户最后一次看到的时间数据库每 60 秒?我在任何地方都找不到有关此函数中内容的信息。
2021-05-12 12:03:50
另一个简单的答案:stackoverflow.com/questions/24402047/...
2021-05-20 12:03:50

根据定义,您所要求的(在澄清之后)是不可能的。HTTP 是一种无连接协议,因此一旦用户点击页面并且所有内容从服务器返回到用户的浏览器,两者之间就没有连接。有人在您的网站上“在线”不到一秒钟。

可以做的一件事是在您的网页上使用 JavaScript,使用window.onbeforeunload定期将 AJAX 请求发送回您的服务器,其中包括识别信息,以及当用户离开页面时不同的 AJAX 请求

这个浏览器事件“onbeforeunload”非常棒,但是当用户的互联网连接丢失并且他关闭浏览器标签时它不起作用
2021-05-10 12:03:50

我的方式可能不是最好的方式,但由于我的网站和用户群都在 mysql DB 中,当用户登录我的网站时,

  1. 我更新用户表说他们在线
  2. 将它们插入到在线表中
  3. 然后我设置了一个当前时间的会话

然后在每个页面加载我检查在线时间会话,如果它存在,我检查它的年龄,如果它小于 5 分钟,我什么都不做,如果它大于 5 分钟,然后我更新使用当前时间再次使用会话时间,并使用时间更新在线用户表

然后我有一个 cron 作业,它每 10 - 15 分钟运行一次,它从在线表中删除任何使用,如果在线时间在 X 分钟内更新,则将用户表标记为离线

听起来您的“是在线人”比较逻辑没有考虑时区。如果您以这种方式处理时区,我强烈建议您将所有时间存储在 GMT 中,并在显示之前将它们转换为用户的当地时间。这将使任何比较操作变得非常简单。

有一个关于时区一个不错的SO线程在这里

+1 为格林威治标准时间。其次是使用服务器时间。但是,如果您需要跨时区移动服务器,就会搞砸您的所有历史数据。以格林威治标准时间存储日期时间要好得多。服务器时间也适用于只能从单个位置(如办公室)访问的内部数据库。但即使是办公室也可以移动。
2021-04-21 12:03:50

我建议的一件事是将此类信息存储在内存中,例如 memcached 或 mysql 堆或 redis。因为否则数据库会被打很多。