【发布时间】:2011-06-30 12:24:47
【问题描述】:
我有一个带有用户名的 PHP $_SESSION 变量。我有一个 MYSQL 数据库,其中有一个用户名的唯一字段。如何使数据库与在线用户的姓名保持同步,以及在他们离开时将其删除。有什么办法可以用 JQuery.ajax 做到吗?
【问题讨论】:
我有一个带有用户名的 PHP $_SESSION 变量。我有一个 MYSQL 数据库,其中有一个用户名的唯一字段。如何使数据库与在线用户的姓名保持同步,以及在他们离开时将其删除。有什么办法可以用 JQuery.ajax 做到吗?
【问题讨论】:
我这样做的方式是使用 AJAX 定期 ping 一个特殊的处理程序(每 30 秒一次)。这是一大堆请求,所以不是每次都更新在线用户表,而是更新内存缓存。我只在 memcache 记录落后 5 分钟时才更新数据库记录(您可以根据负载选择更大或更小的延迟)。然后一个 cron 作业从在线用户表中删除过时的记录。
要检查特定用户是否在线,我只需检查他的内存缓存记录。错误永远不会超过 30 秒。数据库永远不会落后超过 5 分钟,因此数据库的结果也非常准确。
我还使用这些定期请求将事件推送给用户。
【讨论】:
对于登录用户,您可以轮询对服务器的请求,更新时间戳。在一个固定的时间间隔(比如 5 分钟)之后,您有一个 cron 作业,它会从在线用户表中删除时间戳超过 5 分钟的记录。
如果用户注销,您可以直接从在线用户表中删除条目。为了提高准确性,您可以将间隔减少到 2 分钟。
【讨论】:
确定我的用户何时上线的最简单方法是在登录期间。您可以在用户表中添加一个名为 last_login 或 last_seen 的列,并在用户成功登录时更新该列。
除非用户明确退出,否则很难确定用户是否仍然在线。如果您不介意额外的数据库写入,您可以在每次加载页面并进行登录检查时更新last_seen 列。那么你必须设置一个合理的时间(15 分钟,30 分钟?)作为用户可能还在的时间。
您可以使用 ajax 和诸如关闭窗口之类的事件或其他用户离开页面的事件来更新类似 last_logout 的列,但我不会依赖它:
【讨论】:
最简单的方法是创建 MySQL MEMORY 表,您应该在每个新请求(针对每个用户)上添加/更新记录。表的唯一键应该是会话 ID,并且您还应该有时间戳列(在更新/插入时)。如果您愿意,您可以添加 userID 列,以防您需要有关用户的一些信息(在您的情况下为用户名) 然后使用 cron 作业删除所有旧的记录,例如 5 分钟。您当然可以更改此值,但每分钟运行一次 cron。 为什么是内存表?因为它很快(稍微增加内存使用)所以你不会感觉到差异,并且在服务器重新启动的情况下它会自动清除。
【讨论】: