检查在线用户

3

我有一个PHP $_SESSION变量,其中包含用户的名称。我有一个MYSQL数据库,其中有一个唯一的字段用于用户的名称。如何使数据库与在线用户的名称保持同步,并在他们离开时将其删除。是否可以使用JQuery.ajax来实现?

4个回答

0
对于已登录的用户,您可以轮询服务器请求并更新时间戳。在固定的时间间隔内,比如5分钟,您可以设置一个cron job来删除在线用户表中时间戳早于5分钟的记录。
如果用户退出登录,您可以直接从在线用户表中删除条目。为了更准确,您可以将时间间隔减少到2分钟。

我确实需要结果非常准确。用户可能会使用超过半个小时。 - JJJollyjim

0

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

除非用户明确注销,否则很难确定用户是否仍然在线。如果您不介意额外的数据库写入,您可以在每次页面加载和登录检查时更新last_seen列。然后,您必须设置合理的时间(15分钟、30分钟?)作为用户仍可能存在的时间。

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

  • 用户可能有多个窗口/标签打开
  • 用户可能已禁用javascript
  • 用户可能已失去互联网连接
  • 等等。

0
我处理的方式是每隔30秒使用AJAX定期ping一个特殊的处理程序。这是大量的请求,所以我不是每次都用最后访问时间更新在线用户表,而是更新memcache。只有当数据库记录落后于memcache记录5分钟时(您可以根据负载选择更大或更小的延迟),我才会更新数据库记录。然后,一个cron作业从在线用户表中删除过期记录。
要检查特定用户是否在线,我只需检查他的memcache记录。错误永远不会超过30秒。数据库永远不会落后于5分钟,因此来自数据库的结果也相当准确。
我还使用这些定期请求向用户推送事件。

0

最简单的方法是创建MySQL MEMORY表,在每个新请求(对于每个用户)中添加/更新记录。 表的唯一键应该是会话ID,并且您还应该有时间戳列(在更新/插入时)。如果需要某些关于用户的信息(例如用户名),则可以添加userID列。 然后使用cron作业删除所有早于5分钟的记录。 当然,您可以更改此值,但每分钟运行cron即可。 为什么使用内存表? 因为它速度快(略微增加内存使用),因此您不会感到任何区别,并且在服务器重新启动时自动清除。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接