PHP 最佳实践跟踪登录用户


PHP best practice keep track of logged in users

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

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

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

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

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

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

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

如果何时注销不为空,后者将变为 0,或者在 24 小时等长时间限制之后。 我想FB在让您长时间登录的同时,也会出于聊天等目的跟踪活动,但不确定。 我也在考虑让表格扩展,而不是删除已关闭的会话,但这可能是一个错误。

这种方法是否被认为足够,或者是否有更好的方法。 非常感谢对此的建议。

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

  • 定义超时,在此时间后,您将用户注销
  • 使用 ajax/websockets/whatm 轮询用户

1:超时

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

要了解有多少用户处于联机状态,您需要对此数据库执行查询,并对过去 N 分钟内处于活动状态的用户进行计数。

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

2:持续轮询

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

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

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

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

为了规避知道用户是否已注销或浏览器崩溃等问题,请使用各种心跳/轮询,这是一个精简的示例,说明如何使用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 秒,那么您将注销它们。

常量轮询和使用检测信号是一个好主意,但在某些情况下,它们可能会在服务器上创建无用的负载。我认为您应该考虑跟踪用户并非常适当地使用它的重要性,特别是考虑到您的更改可能对加载时间产生的影响。