我使用 php 和 ajax 创建了一个聊天系统。当用户登录到这个聊天系统时,in tableis_online
字段状态会更新为 1。我正在使用此字段列出当前在线成员。
如果用户在不按注销的情况下关闭我网站的所有选项卡,我必须将状态更新为 0 。
我该怎么做?
没有故障证明,实时,有效的方法
从理论上讲,没有办法安全地确定浏览器的状态。有诸如 DOM onunload或onbeforeunload事件之类的事件。可能您可以附加一个 AJAX 请求作为对该事件的响应。那将设置online=0
。但问题是不能保证这个事件会一直触发。(比如浏览器进程被杀死时会发生什么?)
唯一的标准解决方案是定期向服务器发送非常轻量的 AJAX 请求。服务器端程序应该为每个用户维护该lastSeenAtTime
字段,并在某个特定时间(可能是 10 分钟?)内没有收到请求时自动设置为零
跟踪表中的最后一条消息/操作。要更新计数器,只选择他们最后一次操作不超过 1 分钟前的那些。而且,如果你愿意,可以使用 is_online 来跟踪注销:)
真是糟糕的方法。
online_users
用字段name
和制作一个表格timeout
。存储用户名(或 ID,或任何其他标识)和当前时间戳 + 5 分钟(或不同的阈值,由您决定)。
显示在线用户时,从该表中选择timeout
比当前时间戳大的所有用户。例子:
$time = time();
$result = mysql_query("SELECT `name` FROM `online_users` WHERE `timeout` > '$time'");
并设置一个每天清洁一次桌子的 CRON。
并且不要忘记更新timeout
。
我认为您应该每 5 分钟检查一次用户的活动,例如,当用户关闭计算机时,雅虎显示在线状态,但 5 分钟后显示离线。这是我的算法。我认为你不能每秒检查一次,而且检查时间有延迟