如何在线/离线

时间:2010-08-08 19:00:36

标签: php session-timeout

我有一个登录系统。 使用我的登录会话存储和cookie(如果你“记住我”)然后你登录。当你在home.php的登录系统内时(你只能在会话/ cookie注册的情况下输入),我希望“用户”表中的状态字段在你退出时更新为在线和离线。

我知道如何执行此操作,在登录和注销时更新状态,但事情就是这样:当用户离开网站而不注销时(按实际注销按钮),我该怎么办?我的意思是如果状态设置为在线并且您离开页面,它将保持在线您可能理解..逻辑..所以我在这种情况下该怎么办?当你离开页面的时候,我不希望有一个丑陋的弹出窗口让你退出,这是如此古老的学校和糟糕的。

或者当会话用完时你将状态设置为离线?但是,我该怎么做呢?

关于解决方案的想法和例子会很好。

像Facebook这样的网站,如果你离开页面,你可以在聊天中将状态更改为空闲状态,如果你离开页面,有一段时间你离线了......我怎么也不知道。

7 个答案:

答案 0 :(得分:4)

Facebook有点讨厌,因为他们的页面包含一些Javascript,可以保持与聊天服务器的开放连接。一旦连接丢失,这意味着您已关闭页面(或您的互联网连接),并且您已标记为脱机。

通常,只使用超时标记用户在上次活动/页面加载后的某个时间离线。例如,此超时的合理值可以是其会话cookie到期之后的时间。

答案 1 :(得分:1)

简单的解决方案是节省用户上次访问的时间,如果他真的已退出或过去时间过长,则认为他处于离线状态。

为了获得更好的解决方案(类似于facebook),您需要使用半持久性连接,并使用它们以更精细的方式检测存在。

答案 2 :(得分:0)

  

如果用户离开网站而未注销(按实际注销按钮),该怎么办?

好吧,你无法察觉。您可以做的最好的是“最后一次活动”统计或“在过去的几分钟内活动的用户”。在这种情况下,您应该更新用户发出页面请求的每种类型的数据库字段。

答案 3 :(得分:0)

您可以在页面加载时存储时间戳,然后在已经过去的时间内基于在线/离线状态。

答案 4 :(得分:0)

例如,您可以在用户的​​表中包含一个名为last_visit的字段,并在访问任何页面时使用sysdate,now()等更新它...

在为您提供在线用户的查询中,您将使用last_visit字段中十分钟或更短时间内的用户对其进行过滤....

像:

where last_visit < today-(10 minutes)

答案 5 :(得分:0)

我猜你应该做类似于AJAX推送的事情。 @Wim也提出了类似的方法。

答案 6 :(得分:0)

我最近一直在用PHP写一个网站作为一种爱好,改变了常规,我对此的看法是,会话存储在文件中:

  • 有一个单独的表并列出用户ID,last_update时间,会话ID
  • 在名为last_active
  • 的会话中存储变量
  • 在每个页面调用上检查最后一个活动时间是否小于30秒(或任何你想要的)如果它更长,那么在第一步中更新表,如果不继续。这样就可以阻止您在每个页面上进行呼叫,并在一分钟左右内准确无误。

数据库中的会话ID是不必要的,只是很高兴看到谁有什么会话ID活跃,我甚至写了一些hackish函数来手动删除基于此id的会话文件,如果我想记录某人...没有真正的理由,只是有点乐趣。

当然,如果您要在数据库中保存会话,那么当您在每个页面进行数据库访问时更加容易,因此更新它并不是一个问题。

你也可以添加一些ajax来保持数据库更新,即使页面打开但没有被主动刷新然后正如别人指出你通过检查谁的最后更新数据库条目在你想要的任意范围内来检查谁在线