2010-08-08 50 views
3

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

我知道如何做到这一点,当你登录和注销时更新状态,但这里是这样的:当用户离开网站时没有注销(按下实际的注销按钮),我该怎么办?我的意思是,如果状态设置为在线,并且您离开该页面,它将保持在线,您可能会理解..logic ..那么,在这种情况下我该怎么做?我不想有一个难看的弹出窗口,当你离开页面时会注销你,这太旧了,太糟糕了。

或者,也许当会话用完,然后你设置状态为离线?但是,我应该怎么做呢?

对此的解决方案的想法和例子会很好。

网站类似e.g脸谱,在聊天你改变现状,如果你离开这个页面,空闲,不知何故,如果你离开这个页面并没有去一段时间,你下线......怎么样,我不知道。

+0

[Pusher](http://pusher.com/)可能是解决方案! – gabitzish 2012-07-30 06:49:01

回答

4

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

通常,仅使用超时标记用户在最后一次活动/页面加载后的一段时间脱机。例如,这个超时的合理值可能是其会话cookie到期之前的时间。

+0

+1好的策略,我没有想到这一点。 – Artefacto 2010-08-08 19:06:13

+0

@Wim你好,我不太了解你的sessiontimeout方法,它应该如何运行一个查询后,用户离开了页面,并没有点击一些东西?服务器可以使用session-timeout或者自己运行查询吗?你能否也请提供一个小例子 – Karem 2010-08-08 19:14:22

+0

你的数据库只包含上次访问的时间,而不是实际的在线/离线字段。一旦你想知道在线/离线状态(例如在另一个访问者的页面加载期间),从数据库获取最后访问时间并从当前时间中减去它,然后与你的超时进行比较。 – Wim 2010-08-08 19:19:12

0

我该如何做,当用户离开网站没有注销(按下实际注销按钮)?

嗯,你无法检测。你可以做的最好的是“最后活跃”统计或“最近几分钟活跃的用户”。在这种情况下,您应该更新每个用户发出页面请求的数据库字段。

+0

是的,你可以(大部分)。 [看到这个](http://ajaxpatterns.org/Heartbeat) – NullUserException 2010-08-08 19:28:10

+0

@Null我看不出矛盾。这正是我所说的,除了年龄要求被强制在一段时间之外。 – Artefacto 2010-08-08 19:37:18

0

您可以在页面加载上存储时间戳,然后将在线/离线状态设置为过去的时间量。

0

你可以在用户的​​表名为LAST_VISIT例如现场,并与SYSDATE更新,现在(),等他访问任何页面时...

在,让您的网上查询用户,您将与在该领域的用户筛选它LAST_VISIT十分钟少....

,如:

where last_visit < today-(10 minutes) 
1

简单的解决方法是保存的最后访问时间用户,如果他真的注销或者如果那时我认为他是离线的过去太久了。

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

0

我想你应该做一些类似于AJAX推送的东西。 @Wim也提出了类似的方法。

+0

仅供参考@用户名只能在注释中使用,不能回答 – Wim 2010-08-08 19:37:28

+0

@Wim谢谢,有没有办法在答案中使用它们? – thelost 2010-08-09 04:32:00

+0

不是我所知道的。你可以在其他人的回答中发表评论,然后在那里提及你自己的回答。 – Wim 2010-08-09 12:31:15

0

我已经在PHP从规范编写的网站作为一种业余爱好最近的变化和我拿到这个是,在会话存储在文件:

  • 有一个单独的表格和列表用户ID,last_update时间,会话ID
  • 在会话中存储变量last_active
  • 在每个页面上调用检查上次活动时间是否小于30秒(或任何您想要的)如果时间更长则更新表在第一步,如果不继续。这样可以阻止你在每一页上都需要打电话,并且在一分钟左右的时间内就会准确无误。

在数据库中的会话ID是不必要的,只是很高兴看到谁拥有什么会话ID活跃,我甚至写了一个有点hackish的功能来删除一个手工基础上,基于此标识的会话文件,如果我想把某人出门......没有真正的理由,只是有点乐趣。

当然,如果您要将会话保存在数据库中,那么它会更容易,因为无论如何,您要在每个页面上执行数据库之旅,因此更新并不是什么大问题。

即使当页面打开但未被主动刷新时,您也可以添加一些ajax以保持数据库的更新,然后当其他人指出您通过检查最后一次更新数据库条目是否在任意范围内想。