我目前正在尝试使用 php 会话变量在我的站点用户页面上显示所有在线用户。为此,每当用户登录或注销时,数据库中的列都会设置为“1”或“0”。但这并不完全有效,因为当用户关闭浏览器时数据库不会更新(因此破坏了会话)。那么是否有另一种方法来检查是否设置了某个 sessionid?我也想知道 twitter 和 facebook 是如何处理这个问题的?
3 回答
你几乎拥有它。绝大多数站点处理该问题的方式是像您一样拥有一个表,但它们会为其添加时间戳并在加载新页面时更新时间戳。
查询表时,您只需查找最近五分钟的活跃用户,他们是网站上的“实时”用户。
从技术上讲,您甚至不需要在该表中保留“登录/注销”值。如果他们在最后五分钟内登录,他们可能还在。
没有保证、万无一失、完全防弹的方法来检查用户是否在那里。你可以做一些棘手的 JS 来开启和关闭,你可以添加更多的 JS,当用户离开页面时,它会尝试提醒数据库 - 但归根结底,如果浏览器是意外关闭,或者如果该用户断电或网络中断。
最重要的是,Web 浏览默认情况下是无状态的,并且在服务器完成发送代码后不会保持与用户的连接。我们可以有效做的最好的事情是在用户执行新操作并假设他们至少会出现几分钟时更新表格。
我还没有检查,但 Twitter 和 Facebook 很可能有 Javascript 代码,当有人关闭页面时通知服务器,可能加上周期性的心跳和超时。
检查onunload 事件和XMLHTTPRequest以了解如何向 PHP 应用程序发出请求以通知用户离开(像jQuery这样的库可能会帮助您更轻松地做到这一点)。
在用户的表中添加一个字段“last_visit”,并在每次用户访问您的站点时更新它
当用户登录您的站点时,查找“last_visit”时间和当前时间,然后使用此功能
$time_period = floor(round(abs($current_time - $last_visit)/60,2));
if ($time_period <= 10)
$online_offline_status = 1;
else
$online_offline_status = 0;
}
然后打印你的最终结果
<?php if (
$online_offline_status == 0){ ?>
<span style="color:#FF0000;">Offline</span>
<?php } else if ($online_offline_status == 1) {?>
<span style="color:#669900;">Online</span>
<?php }?>