有没有办法可以通过会话来了解用户是否在线?
即:使用登录,我设置了一个 $_SESSION 变量,用户超时 cookie 垃圾收集器更新数据库以更新其状态为离线。
EDIT:
我想要一个不涉及时间或日期的解决方案。我想要一些骑在会议或类似的东西。猜测是否有人在线不足以满足我的需求。
有没有办法可以通过会话来了解用户是否在线?
即:使用登录,我设置了一个 $_SESSION 变量,用户超时 cookie 垃圾收集器更新数据库以更新其状态为离线。
EDIT:
我想要一个不涉及时间或日期的解决方案。我想要一些骑在会议或类似的东西。猜测是否有人在线不足以满足我的需求。
不要费心弄清楚时区之间的差异。那没有必要。
每当用户访问页面时,更新用户表上次更新时间记录中的字段。然后查询在过去 5 分钟内具有最后更新时间的所有用户。除此之外的任何东西,它们都被视为“离线”。
如果您使用服务器时间,通过 MySQL 中的 NOW() 函数,您将回避计算时区之间的差异。
这是跟踪当前在线用户数量的标准方法(意思是,在过去几分钟内处于活动状态)。
如果您想知道即使它们没有在页面之间跳转,它们仍然处于活动状态,请包含一些 javascript 以每 60 秒左右 ping 您的服务器,让您知道它们仍然存在。它的工作方式与我最初的建议相同,但它会更新您的记录,而无需他们至少每五分钟疯狂浏览一次您的网站。
var stillAlive = setInterval(function () {
/* XHR back to server
Example uses jQuery */
$.get("stillAlive.php");
}, 60000);
根据定义,您所要求的(在澄清之后)是不可能的。HTTP 是一种无连接协议,因此一旦用户点击页面并且所有内容从服务器返回到用户的浏览器,两者之间就没有连接。有人在您的网站上“在线”不到一秒钟。
您可以做的一件事是在您的网页上使用 JavaScript,使用window.onbeforeunload定期将 AJAX 请求发送回您的服务器,其中包括识别信息,以及当用户离开页面时不同的 AJAX 请求。
我的方式可能不是最好的方式,但由于我的网站和用户群都在 mysql DB 中,当用户登录我的网站时,
然后在每个页面加载我检查在线时间会话,如果它存在,我检查它的年龄,如果它小于 5 分钟,我什么都不做,如果它大于 5 分钟,然后我更新使用当前时间再次使用会话时间,并使用时间更新在线用户表
然后我有一个 cron 作业,它每 10 - 15 分钟运行一次,它从在线表中删除任何使用,如果在线时间在 X 分钟内更新,则将用户表标记为离线
听起来您的“是在线人”比较逻辑没有考虑时区。如果您以这种方式处理时区,我强烈建议您将所有时间存储在 GMT 中,并在显示之前将它们转换为用户的当地时间。这将使任何比较操作变得非常简单。
有一个关于时区一个不错的SO线程在这里。
我建议的一件事是将此类信息存储在内存中,例如 memcached 或 mysql 堆或 redis。因为否则数据库会被打很多。