【问题标题】:Check what users are online检查哪些用户在线
【发布时间】:2011-06-30 12:24:47
【问题描述】:

我有一个带有用户名的 PHP $_SESSION 变量。我有一个 MYSQL 数据库,其中有一个用户名的唯一字段。如何使数据库与在线用户的姓名保持同步,以及在他们离开时将其删除。有什么办法可以用 JQuery.ajax 做到吗?

【问题讨论】:

    标签: php mysql session jquery


    【解决方案1】:

    我这样做的方式是使用 AJAX 定期 ping 一个特殊的处理程序(每 30 秒一次)。这是一大堆请求,所以不是每次都更新在线用户表,而是更新内存缓存。我只在 memcache 记录落后 5 分钟时才更新数据库记录(您可以根据负载选择更大或更小的延迟)。然后一个 cron 作业从在线用户表中删除过时的记录。

    要检查特定用户是否在线,我只需检查他的内存缓存记录。错误永远不会超过 30 秒。数据库永远不会落后超过 5 分钟,因此数据库的结果也非常准确。

    我还使用这些定期请求将事件推送给用户。

    【讨论】:

      【解决方案2】:

      对于登录用户,您可以轮询对服务器的请求,更新时间戳。在一个固定的时间间隔(比如 5 分钟)之后,您有一个 cron 作业,它会从在线用户表中删除时间戳超过 5 分钟的记录。

      如果用户注销,您可以直接从在线用户表中删除条目。为了提高准确性,您可以将间隔减少到 2 分钟。

      【讨论】:

      • 我确实需要结果非常准确。用户可能会在一个小时内开启超过 1/2 的时间。
      【解决方案3】:

      确定我的用户何时上线的最简单方法是在登录期间。您可以在用户表中添加一个名为 last_loginlast_seen 的列,并在用户成功登录时更新该列。

      除非用户明确退出,否则很难确定用户是否仍然在线。如果您不介意额外的数据库写入,您可以在每次加载页面并进行登录检查时更新last_seen 列。那么你必须设置一个合理的时间(15 分钟,30 分钟?)作为用户可能还在的时间。

      您可以使用 ajax 和诸如关闭窗口之类的事件或其他用户离开页面的事件来更新类似 last_logout 的列,但我不会依赖它:

      • 用户可以打开多个窗口/选项卡
      • 用户可能禁用了 javascript
      • 用户可能已失去互联网连接

      【讨论】:

        【解决方案4】:

        最简单的方法是创建 MySQL MEMORY 表,您应该在每个新请求(针对每个用户)上添加/更新记录。表的唯一键应该是会话 ID,并且您还应该有时间戳列(在更新/插入时)。如果您愿意,您可以添加 userID 列,以防您需要有关用户的一些信息(在您的情况下为用户名) 然后使用 cron 作业删除所有旧的记录,例如 5 分钟。您当然可以更改此值,但每分钟运行一次 cron。 为什么是内存表?因为它很快(稍微增加内存使用)所以你不会感觉到差异,并且在服务器重新启动的情况下它会自动清除。

        【讨论】:

          猜你喜欢
          • 2011-12-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-05-28
          • 1970-01-01
          • 1970-01-01
          • 2013-09-03
          相关资源
          最近更新 更多