请告诉我,以确定最简单的方法,如果用户是在线? (PHP / MYSQL) 请告诉我,以确定最简

2019-05-12 22:00发布

有没有一种方法可以让我捎带会话知道,如果用户在线?

即:使用日志上,我设置了$ _SESSION变量,用户时间OUT-cookie的垃圾收集器更新数据库更新他们为脱机状态。

EDIT:我想,不涉及时间或日期的解决方案。 我想要的东西骑在会议或类似的东西。 猜测如果有人在网上是不是我所需要的足够好。

Answer 1:

不要搞清楚时区之间的差异麻烦。 这是没有必要的。

每当用户访问一个网页,在他们的用户表的记录最后更新时间更新的字段。 然后做有最后5分钟内的最后更新时间所有用户的查询。 任何比这更多,他们被认为是“脱机”。

如果你使用你的服务器时,通过在MySQL的NOW()函数,你会侧步计算时区之间的差异。

这是跟踪有多少用户是目前在线(意思是,最后几分钟内有效)的标准方法。

不断更新

如果你想知道他们是仍然活跃,即使他们没有从页面跳转到页面,包括一些JavaScript来ping服务器每隔60秒左右,让你知道他们还活着。 它会的工作方式与我原来的建议相同,但它不要求他们是疯狂地浏览你的网站至少一次,每五分钟更新您的记录。

var stillAlive = setInterval(function () {
    /* XHR back to server
       Example uses jQuery */
    $.get("stillAlive.php");
}, 60000);


Answer 2:

你所要求的(澄清后),顾名思义,是不可能的。 HTTP是一种无连接协议,因此只要用户已经达到一个页面,所有内容来自服务器到用户的浏览器后面,有两者之间没有联系。 有人为“在线”与您的网站不超过一秒钟。

有一两件事你可以做的是有你的JavaScript的网页上使AJAX请求返回到服务器定期,其中包括识别信息,并在用户离开页面,使用window.onbeforeunload不同的AJAX请求。



Answer 3:

我的方法可能不是最好的方式,但因为我的网站和用户群是所有在MySQL数据库中,当用户登录到我的网站,

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

然后在每个页面加载我检查在线时间会话,如果它存在,我检查,看看它有多老,如果是小于5分钟之前,我什么都不做,如果是旧的,然后5分钟,然后我更新会话与当前时间一次又一次也随着时间更新在线用户表

然后,我有一个运行每10 cron作业 - 24分钟,从网上删除表中的任何用途,标志着有用户表为脱机,如果有在线时间分钟的X金额内更新



Answer 4:

这听起来像你“是在网上的人”比较逻辑不考虑时区。 如果你以这种方式处理的时区,我强烈建议你在任何时候都存储在格林尼治标准时间,并将其转换为本地时间为你的用户,你展示他们的权利之前。 这将使任何比较操作非常简单。

有一个很好的SO线程有关时区在这里 。



Answer 5:

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



Answer 6:

存储在表中的时区,并用它在计算中发现用户本地时间相比,用户浏览页面的本地时间。

编辑:

更重要的是,任何时候都存储在服务器的时间,相对于基仅到服务器时,所有的计算。



Answer 7:

取决于你的情况,它可能是更好地为您创建一个单独的表“其-在线”同列:“IP”和“最后更新时间”和查询/更新此表中的每个用户加载一个页面的时间。

在页面加载查询可以包括

  1. 更新/插入基于IP“其-在线”表中当前用户。
  2. 删除“过期”行(也可以使用的cronjob定期进行)。
  3. 计数“活跃”用户。

使用这种技术的优点

  1. 如果用户没有登录,他/她仍在统计中/跟踪。
  2. 取决于你所拥有的用户数量,查询该表可能会更快。

注:如果您使用这个你应该要考虑到的任何网页浏览会在你的表中创建一个行,以便根据用户代理可以无视机器人或只能算流行的(火狐,IE,Safari浏览器,歌剧等)。



Answer 8:

我已经为这个实现的解决方案是,通过认证的用户的每一页负载,设置/复位一个内存缓存VAR诸如“用户_ {用户ID} isonline” =>真,并在5分钟后过期它。 然后检查了var在高速缓存中,当我访问用户的信息。 根据您的用户群的大小,如果你想获得大家的名单在网上,你可以使用一个内存缓存getmulti以“用户 {}用户ID _isonline”键为所有用户的数组来调用

当然,这真的取决于用户如何经常变化的网页上您的网站...获得用户的更准确的表示在线,你可以实现在一个小的区间运行你的页面上的AJAX XMLHttpRequest调用(30秒左右)用于复位的memcache变种,并有记忆快取的VAR在更短的时间(1分钟占可能的浏览器问题)到期。 这并不完全准确,但由于HTTP不具有对服务器的持久连接,你几乎在你可以做什么限制。

如果您需要最多的是谁在线第二表示,也许你可以在你的页面连接到一个Jabber服务器加载的Flash应用程序,那么就检查特定的用户登录到服务器上。



Answer 9:

您也可以使用onunload标签......在身体更多的信息在这里( https://www.w3schools.com/jsref/event_onunload.asp )

这样,您就不必等待4-5分钟,让用户下线。

但你还是应该使用AJAX更新方法柜面用户的浏览器崩溃...



Answer 10:

下面是关于如何从一个以分钟为数据库得到两个日期之间的差异的方式,然后检查的差别,并设置在线/离线状态。

$query = 'SELECT * FROM Users';
$result = mysqli_query($mysqli, $query);

foreach($result as $user){
    // date from the database
    $dbLastActivity = date("d-m-Y h:i:s a", strtotime($user['lastOnline']));
    // date now
    $now = date("d-m-Y h:i:s a", $date);

    // calculate the difference
    $difference = strtotime($now) - strtotime($dbLastActivity);
    $difference_in_minutes = $difference / 60;

    // check if difference is greater than five minutes
    if($difference_in_minutes < 5){
        // set online status
        $updateStatus = 'UPDATE Users SET Status="online" WHERE lastOnline="'.$user['lastOnline'].'"';
    } else {
        // set offline status
        $updateStatus = 'UPDATE Users SET Status="offline" WHERE lastOnline="'.$user['lastOnline'].'"';
    }

    // check if mysqli query was successful
    if (!$mysqli->query($updateStatus)){
        printf("Error Message %s\n", $mysqli->error);
    }
} 


文章来源: Whats the easiest way to determine if a user is online? (PHP/MYSQL)