【问题标题】:How to make online/offline如何使在线/离线
【发布时间】:2010-08-08 19:00:36
【问题描述】:

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

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

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

解决这个问题的想法和例子会很好。

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

【问题讨论】:

  • Pusher 可能是解决这个问题的方法!

标签: php session-timeout


【解决方案1】:

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

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

【讨论】:

  • @Wim 你好,我不太明白你的 sessiontimeout 方法,它应该如何在用户离开页面并且没有点击某些东西之后运行查询?服务器可以使用会话超时自行运行查询吗?能否请您提供一个小例子
  • 您的数据库只包含上次访问的时间,而不是实际的在线/离线字段。一旦您想知道在线/离线状态(例如在另一个访问者的页面加载期间),请从数据库中获取上次访问时间并将其从当前时间中减去,然后与您的超时时间进行比较。
  • 您还可以运行一个将用户标记为离线的周期性任务,但这样做的开销可能比每次您想知道状态时进行比较要糟糕得多。
  • 哦,好吧,我想我明白了,但我不知道如何“从当前时间中减去它并与您的超时时间进行比较”,LastTime-TimeNow = timeout,在编码中,您能做一个举个例子,谢谢。
  • 是的,这是最简单的方法,只需在 MySQL 中使用 time() 和一个 INTEGER 字段。您可以使用 DATETIME 或 TIMESTAMP 字段,但它会变得更加复杂。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • @Null 我看不出有什么矛盾。这正是我所说的,除了年龄请求是强制间隔的。
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

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

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

      喜欢:

      where last_visit < today-(10 minutes)
      

      【讨论】:

        【解决方案6】:

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

        【讨论】:

        • @Wim 谢谢,有没有办法在答案中使用它们?
        • 我不知道。不过,您可以在其他人的答案中发表评论,并在其中引用您自己的答案。
        【解决方案7】:

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

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2012-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-20
          • 1970-01-01
          • 2020-05-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多