2009-12-15 79 views
4

我想捕捉以下参数:如何跟踪用户在线状态?

lastAccessedTime - 的时间,当用户访问该网站的最后时间(通常在登录过程中示出)

isOnline - 一个布尔值来表示,如果用户是在线或不在线。

a。将这些变量作为用户表本身的一部分,还是应该通过单独的用户审计表处理?

b。如果某些SOAP/REST API通过API调用公开了这些功能,那么您如何跟踪上述参数(例如,在这种情况下您会修改lastAccessedTime--如果用户登录门户网站,这可能会导致用户混淆,而且在线位也不会有意义如果用户进行API调用)。

回答

6

我会创建一个链接回用户的会话表。而不是一个isOnline字段,我只会运行一个查询,查询在最后x时间内处于活动状态的会话。我也会用每个请求更新该会话字段,即使该请求是通过API传递的。

这确实会在修剪会话表时产生一些开销,但是您也不会用非用户信息弄乱用户表,这些信息无法修剪。

3

在用户表中创建lastTimeActive字段,并使用每个页面访问进行更新。您的“用户在线”列表是lastTimeActive在5分钟内的所有用户。

1

我会创建另一个表(userid,lastTimeActive),并经常更新&检查表。

// update 
update onlineusers set lastTimeActive = getdate() where userid=1234 

// check 
delete from onlineusers where lastTimeActive < dateadd(minute,-5,getdate()) 
+0

哦,不...这太可怕了......这会杀了你的服务器...... – Faruz 2009-12-15 06:42:24

+1

我保持超过1000.000用户的一个门户。但是一次只有100个在线用户(不到1%)。选择/更新/删除新表比查询用户表更好。 – 2009-12-15 06:45:32

1

通过HTTP跟踪用户存在(onine/offline)最大的问题是如何确定用户何时离线。

很容易确定用户何时联机 - 只有经过身份验证的请求才会假定用户处于活动状态。但是,由于HTTP是无状态的,因此缺少后续请求可能意味着用户已脱机,或者用户在线,但最近没有做任何特定于您的应用的操作。

因此,您可以做出的最佳猜测是超时,并且如果用户在该超时期间未提出请求,则切换到脱机状态。正如Jonathan Sampson所建议的那样,最简单的实现方法是使用lastTimeActive。但是,这不会给你用户会话的长度,只是此时谁在线的近似值。

更复杂的方法是使用lastTimeActive和lastTimeLoggedIn。 LastTimeLoggedIn在第一次验证请求时设置,与前一个验证请求相距超过5分钟。如果在过去五分钟内有认证请求,则认为用户在线。用户的会话长度是lastTimeActive和lastTimeLoggedIn之间的时间差。

如果您的应用程序还提供了向用户注销的选择,则您可以考虑将该操作也视为脱机。但是,除非您的应用程序是银行应用程序,否则用户可能会关闭浏览器。

此外,避免任何后台线程更新您的用户的脱机/在线状态。你应该在运行上述逻辑,只有当有关于特定用户的状态的明确要求,你应该只更新您将被询问用户。