如何在php聊天系统中获得准确的在线用户数?

如何在php聊天系统中获得准确的在线用户数?,php,ajax,Php,Ajax,我使用php和ajax创建了一个聊天系统。当用户登录此聊天系统时,表中的字段状态更新为1。我正在使用此字段列出当前在线成员 如果用户在不按注销的情况下关闭我网站的所有选项卡,我必须将状态更新为0 我该怎么做呢?我认为你应该每5分钟检查一次用户的活动,例如,当用户关闭电脑时,yahoo msgr会显示在线状态。但5分钟后,它会显示离线状态。这是我的算法。我想你不能每秒钟检查一次,检查时间也有延迟。请跟踪表中的最后一条消息/操作。要更新计数器,请仅选择上次操作不超过(比如)1分钟的计数器。此外,如果

我使用php和ajax创建了一个聊天系统。当用户登录此聊天系统时,表中的字段状态更新为1。我正在使用此字段列出当前在线成员

如果用户在不按注销的情况下关闭我网站的所有选项卡,我必须将状态更新为0


我该怎么做呢?

我认为你应该每5分钟检查一次用户的活动,例如,当用户关闭电脑时,yahoo msgr会显示在线状态。但5分钟后,它会显示离线状态。这是我的算法。我想你不能每秒钟检查一次,检查时间也有延迟。请跟踪表中的最后一条消息/操作。要更新计数器,请仅选择上次操作不超过(比如)1分钟的计数器。此外,如果您愿意,还可以使用它的在线功能,它可以跟踪注销情况:)

没有防故障、实时、高效的方法

从理论上讲,没有安全确定浏览器状态的方法。有类似于DOMonunloadonbeforeunload事件的事件。可能您可以附加一个AJAX请求作为对该事件的响应。这将设置
online=0
。但问题是,无法保证这一事件总是会发生。(比如浏览器进程被终止时会发生什么情况?)

唯一的标准解决方案是定期向服务器发送非常轻的AJAX请求。服务器端程序应该为每个用户维护
lastseenatime
字段,并在特定时间内没有收到请求时自动设置为零(比如10分钟可能是?

非常糟糕的方法


创建一个包含字段
name
timeout
的表
online\u用户
。 存储用户名(或ID,或任何其他标识)和当前时间戳+5分钟(或不同的阈值,由您决定)

显示联机用户时,从
timeout
大于当前时间戳的表中选择所有用户。 例如:

设置一个CRON,每天清理一次桌子

别忘了更新
timeout

看看这个:可能会重复
$time = time();
$result = mysql_query("SELECT `name` FROM `online_users` WHERE `timeout` > '$time'");