会话过期后无法进行查询

时间:2012-05-23 07:12:18

标签: php sql facebook session

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

但是 我仍然在试图实施这个问题,但仍然在试图实施这一目标。

会话过期后如何更新查询? 我不是在谈论明确点击"退出"按钮

这里的基本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();
}

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

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

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

如果用户A忘记点击&#34; LOGOUT&#34;并关闭他的浏览器, user-B仍然可以将User-A视为ONLINE。这就是问题所在。

例如, Facebook处理得非常好,

假设您的朋友刚刚关闭浏览器(即他的会话不再存在), 那么你可以看到他离线

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

4 个答案:

答案 0 :(得分: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,只是一些建议。不幸的是,实施这些工作非常费力,我认为上面的建议(在编辑之前)应该适用于一个共同的网站。

答案 1 :(得分:2)

我不确定facebook如何控制这些东西,但我可以从头脑中建议你如何解决这个问题。

我会在类型为Date的auth_users表中添加一个新字段,表示session_expiry_time。

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

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

答案 2 :(得分:0)

在页面上使用简单的JavaScript

在正文标记

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

试试吧。

答案 3 :(得分:0)

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