12

我想向用户显示作为评论系统的一部分登录的其他用户。跟踪用户的最佳做法是什么?例如:

您是否跟踪所有会话,然后将它们标记为已关闭。或者您是否在注销时删除用户,只跟踪活动用户。

我在想我应该创建一个包含用户 ID、登录时间、注销时间和/或状态的表。这是要走的路还是有一些跟踪会话ID的替代方法。如果使用表,保留 sessionid 是否有价值。当会话不再活动时,我是否应该删除行,而不需要 whenloggedout 字段。

有一个登录很容易跟踪用户的登录。但是,跟踪用户的退出更难,因为他们的会话可能会因浏览器崩溃等而中断。

只要用户没有破坏会话,就考虑用户登录是否是最佳做法……例如,FB 和 Gmail 将让您几乎无限期地保持登录状态——或者自上次活动以来是否应该有时间限制?每次现场有活动时保存到此表的想法并不吸引人。

现在,我正在考虑以下内容:

create table loggedin (userid (int), whenloggedin (datetime), whenlogged out (datetime), loggedin(tinyint))

如果 whenloggedout 不为 null 或经过像 24 小时这样的长时间限制,则后者将变为 0。我想 FB 在让您长时间登录的同时,还会出于聊天等目的跟踪活动,但不确定。我也在考虑让表格扩展,而不是删除已关闭的会话,但也许这是一个错误。

这种方法是否被认为足够或有更好的方法。许多人对此提出建议。

4

3 回答 3

13

根据您希望它的工作方式,您基本上有两种选择:

  • 定义一个超时时间,在此之后您认为用户已注销
  • 使用 ajax/websockets/whatever 来轮询用户

1:超时

这是更简单的用例。每次用户请求页面时,您都会更新数据库中的时间戳。

要了解有多少用户在线,您可以对该数据库进行查询,并对过去 N 分钟内活跃的用户进行 COUNT 操作。

通过这种方式,您将相对准确地了解目前有多少人在积极使用该网站。

2:持续轮询

由于必须使用 Ajax 更新服务器,因此实现起来有点复杂。否则,它的工作方式与#1 类似。

每当用户在页面上时,您可以保持 websocket 打开或每 N 秒向服务器发出 ajax 请求。

通过这种方式,您可以很好地了解当前有多少人在您的网站上打开了页面,但是如果用户在浏览器中保持页面打开并且不执行任何操作,它仍然会将他们视为在线。

对这个想法的轻微修改是使用客户端上的脚本来监视鼠标移动。如果用户在 10 分钟内没有在您的页面上移动鼠标,您将停止轮询或断开 websocket。这将解决将空闲用户显示为在线的问题。

于 2012-04-20T10:42:57.853 回答
6

为了规避知道用户是否已注销或浏览器崩溃等问题,使用各种心跳/轮询这是一个精简的示例,说明如何使用 jQuery 做到这一点

function heartbeat(){
   setTimeout(function(){
      $.ajax({ url: "http://example.com/api/heartbeat", cache: false,
      success: function(data){
        //Next beat
        heartbeat();
      }, dataType: "json"});
  }, 10000);//10secs
}

$(document).ready(function(){
    heartbeat();
});

http://example.com/api/heartbeat将使会话保持活动状态并更新数据库中的时间戳,然后在每个页面加载时,您将检查当前时间等的时间戳,如果它低于 15 秒,那么您将它们注销。

于 2012-04-20T10:48:09.207 回答
1

恒定轮询和使用心跳是一个好主意,但在某些情况下,它们可能会在服务器上产生无用的负载。我认为您应该考虑跟踪用户并非常恰当地使用它的重要性,尤其是考虑到您的更改可能对加载时间产生的影响。

于 2013-05-08T02:48:48.543 回答