PHP最佳实践跟踪登录用户

时间:2012-04-20 10:36:45

标签: php session

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

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

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

登录时很容易跟踪用户登录。但是,跟踪用户注销会更加困难,因为他们的会话可能因浏览器崩溃等而中断。

最佳做法是考虑用户登录,只要他们没有销毁会话...例如,FB和Gmail会让您几乎无限期地登录 - 或者自上次活动以来是否应该有时间限制?每次在网站上有活动时保存到此表的想法都没有吸引力。

现在,我正在考虑以下事项:

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

如果whenlogout不为null或者在24小时之后的某个长时间限制之后,后者将变为0。我想起FB虽然让你长时间登录,但也为了聊天等目的而跟踪活动,但不确定。我也在考虑让表格扩展,而不是删除已关闭的会话,但这可能是一个错误。

这种方法是否足够或是否有更好的方法。很多人就此提出建议。

3 个答案:

答案 0 :(得分:13)

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

  • 定义您认为用户已注销的超时
  • 使用ajax / websockets / whatever来推送用户

1:超时

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

要了解有多少用户在线,您可以对此数据库进行查询,并执行在最近N分钟内处于活动状态的COUNT个用户。

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

2:常量轮询

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

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

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

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

答案 1 :(得分:5)

要知道用户是否已注销或浏览器崩溃等问题来解决这个问题,那么在这里使用心跳/轮询排序是一个简单的示例,说明如何使用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会使会话保持活跃状态更新数据库中的时间戳,然后在每个页面加载时,您将使用当前时间ect检查时间戳,如果它低于15秒然后您将其注销。

答案 2 :(得分:0)

常量轮询和使用心跳是一个好主意,但在某些情况下,它们可能会在服务器上创建无用的负载。我认为您应该考虑跟踪用户并非常恰当地使用它的重要性。特别是在加载时间。