【问题标题】:Can't make query after session expired会话过期后无法查询
【发布时间】:2012-05-29 17:11:14
【问题描述】:

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

但是 我仍然在努力实施,头撞墙,

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

这是基本的 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 处理得很好,

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

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

【问题讨论】:

    标签: php sql facebook session


    【解决方案1】:

    在页面上使用简单的 JavaScript

    在正文标签中

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

    试试看。

    【讨论】:

      【解决方案2】:

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

      我将在您的 auth_users 表中添加一个新字段,该字段将代表 session_expiry_time 。

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

        • 那些 php 函数不是为此而设计的,根本不可用。他们在线跟踪脚本本身的连接状态,但是一旦提供了 html,就不再有连接;这意味着,当您的页面加载时,您的用户只会“在线”一两秒钟,但是一旦用户查看内容,他就会“离线”。但在这种情况下,这只会让用户开始在线(当第一页加载时)......
        【解决方案4】:

        我认为这里需要另一种方法。不要设置在线/离线标志,而是设置“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,只是一些建议。不幸的是,这些实施起来相当费力,我认为我上面的建议(在编辑之前)应该适用于一个常见的网站。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-08
          • 1970-01-01
          • 2012-07-05
          • 1970-01-01
          • 1970-01-01
          • 2012-11-30
          • 2013-01-22
          相关资源
          最近更新 更多