3

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

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

或者,当会话用完时,您将状态设置为离线?但同样,我应该怎么做?

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

像facebook 这样的网站,在聊天中,如果您离开页面,您将状态更改为空闲,并且如果您离开页面并且有一段时间您处于离线状态,那么您会以某种方式将状态更改为...如何,我不知道。

4

7 回答 7

4

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

通常,只使用一个超时来标记用户在他们最后一次活动/页面加载后的某个时间下线。例如,此超时的合理值可能是其会话 cookie 过期的时间。

于 2010-08-08T19:04:17.130 回答
1

简单的解决方案是保存用户最后一次访问的时间,如果他真的退出或过去时间太长,则将他视为离线。

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

于 2010-08-08T19:06:51.387 回答
0

当用户离开网站而不注销(按下实际的注销按钮)时,我该怎么办?

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

于 2010-08-08T19:04:50.080 回答
0

您可以在页面加载时存储时间戳,然后根据此后的时间量确定在线/离线状态。

于 2010-08-08T19:05:31.350 回答
0

例如,您可以在用户表中有一个名为 last_visit 的字段,并在他访问任何页面时使用 sysdate、now() 等对其进行更新...

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

像:

where last_visit < today-(10 minutes)
于 2010-08-08T19:06:14.327 回答
0

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

于 2010-08-08T19:19:08.530 回答
0

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

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

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

当然,如果您将会话保存在数据库中,那么它会更容易,因为您无论如何都要对每一页进行数据库访问,因此更新它并不是什么大问题。

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

于 2010-08-08T19:19:36.660 回答