会话过期后无法进行查询


Can't make query after session expired

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

但我仍然用头撞墙试图实施,

会话过期后如何更新查询?我不是在谈论显式单击"注销"按钮

以下是基本的 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,

例如假设我们有两个用户:用户 A、用户 B

用户 A 已成功登录,现在用户 B 可以将用户 A 视为在线用户。

如果用户 A 忘记单击"注销"并关闭其浏览器,用户 B 仍可将用户 A 视为联机。这就是问题所在。

例如Facebook很好地处理了这一点,

假设您的朋友刚刚关闭了浏览器(即他的会话不再存在(,然后不知何故,您可以看到他处于离线状态

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

我认为

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

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链接时,该事件都应从浏览器中取消绑定。想不出另一种方式的自动取款机,只是一些建议。不幸的是,这些实施起来非常繁重,我认为我上面的建议(在编辑之前(应该适合一个普通的网站。

我不确定Facebook如何控制这些东西,但我可以从我的头顶上建议你如何处理这个问题。

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

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

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

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

在页面上使用简单的JavaScript

在正文标签中

callLogoff(( 应该替换为调用 log off 的 JavaScript 函数。

试试吧。