【发布时间】:2013-09-21 00:00:21
【问题描述】:
我目前正在尝试使用 php 会话变量在我的站点用户页面上显示所有在线用户。为此,每当用户登录或注销时,数据库中的列都会设置为“1”或“0”。但这并不完全有效,因为当用户关闭浏览器时数据库不会更新(因此破坏了会话)。那么是否有另一种方法来检查是否设置了某个 sessionid? 我也想知道推特和脸书是怎么处理的?
【问题讨论】:
标签: php
我目前正在尝试使用 php 会话变量在我的站点用户页面上显示所有在线用户。为此,每当用户登录或注销时,数据库中的列都会设置为“1”或“0”。但这并不完全有效,因为当用户关闭浏览器时数据库不会更新(因此破坏了会话)。那么是否有另一种方法来检查是否设置了某个 sessionid? 我也想知道推特和脸书是怎么处理的?
【问题讨论】:
标签: php
你几乎拥有它。绝大多数网站处理此问题的方式是像您一样拥有一个表格,但它们会向其中添加时间戳并在加载新页面时更新时间戳。
查询表格时,您只需查找最近五分钟的活跃用户,他们是网站上的“活跃”用户。
从技术上讲,您甚至不需要在该表中保留“登录/注销”值。如果他们在最后五分钟内登录,他们可能还在。
没有保证、万无一失、完全防弹的方法来检查用户是否在场。你可以做一些棘手的 JS 来打开和关闭,你可以添加更多的 JS,当用户离开页面时,它会尝试提醒数据库 - 但归根结底,如果浏览器是意外关闭,或者该用户断电或网络中断。
此外,Web 浏览默认情况下是无状态的,并且在服务器完成发送代码后不会保持与用户的连接。我们可以有效地做的最好的事情是在用户执行新操作并假设他们至少会出现几分钟时更新表格。
【讨论】:
我没有检查,但 Twitter 和 Facebook 很可能有 Javascript 代码,当有人关闭页面时通知服务器,可能加上周期性的心跳和超时。
查看onunload event 和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 }?>
【讨论】: