0

我已经为这些东西狂饮了很多,但找不到直接的答案,我在这里搜索过,

但我仍在努力实施,

会话过期后如何更新查询?我不是在谈论明确点击“注销”按钮

这是基本的SQL结构:

CREATE TABLE auth_users (

 email       varchar(40) NOT NULL,
 password    varchar(40) NOT NULL,
 online      ENUM('1') DEFAULT NULL  <-- HERE, it updates to 1 when user logged in, it updates back to NULL when user explicitly clicks on LOGOUT

) type=MyISAM;

类层次结构:

interface {
    function login();
    function logout();
        //calls after succes authorization
        function set_as_online();
        //calls from within logout() method
        function set_as_offline();
}

但是当用户关闭他的浏览器时,它不会更新回 NULL,

例如,假设我们有两个用户:User-A,User-B

用户 A 成功登录,现在用户 B 可以看到用户 A 为在线用户。

如果用户 A 忘记单击“注销”并关闭浏览器,用户 B 仍然可以看到用户 A 在线。那就是问题所在。

例如,Facebook 处理得很好,

假设您的朋友刚刚关闭了浏览器(即他的会话不再存在),那么您可以以某种方式将他视为 OFFLINE

我究竟做错了什么?处理离线/在线用户的方法不正确?

4

4 回答 4

2

我认为这里需要另一种方法。不要设置在线/离线标志,而是设置“last_seen”时间戳。IE。每个请求都将记录更新为当前时间戳。如果您想知道用户是否在线,只需执行以下操作:

if($current_time - $last_seen_time < $session_expire_limit) {
    // online
} else {
    // offline
}

否则,您需要某种 cronjob 来online在特定时间后自动重置数据库中的标志,但您仍然需要一last_seen列。

// 编辑

我不知道facebook是怎么做的,但它可以是以下之一;对于聊天和通知功能,facebook 会打开一个“流”,这实际上是一个由服务器保持活动状态的小 ajax 调用(顺便说一句,这个 ajax 调用每 40 秒刷新一次)。可能此流用于跟踪在线用户。另一个选项(但不太可能)是将事件附加到 window.unload 事件。这不太可能,因为页面刷新、点击到另一个 Facebook 页面的链接等也会触发该事件。这意味着每次点击内部 facebook 链接时,都应该从浏览器中解除绑定事件。想不出其他办法atm,只是一些建议。不幸的是,这些实施起来相当费力,我认为我上面的建议(在编辑之前)应该适用于一个常见的网站。

于 2012-05-23T07:23:48.280 回答
2

我不确定 facebook 如何控制这些东西,但我可以从头顶向你建议我将如何处理这件事。

我会在您的 auth_users 类型的 Date 表上添加一个新字段,该字段将代表 session_expiry_time 。

然后在您的 html 页面中,您应该实现一些静默 ajax 代码,该代码将调用服务器上的虚拟 php 页面(间隔非常重要,因为您必须平衡性能和功能)。这个虚拟页面将更新 auth_users 表中用户的 session_expiry_time。

因此,在任何给定时间,根据当前时间检查用户的 session_expiry_time 将确定用户是否在线。

于 2012-05-23T07:40:36.117 回答
0

在页面上使用简单的 JavaScript

在正文标签中

callLogoff() 应替换为调用注销的 JavaScript 函数。

尝试一下。

于 2012-05-23T07:22:12.473 回答
0

http://de2.php.net/manual/en/features.connection-handling.php 您可以使用 register_shutdown_function() 和 connection_aborted() 您打算实现

于 2012-05-23T07:40:36.023 回答