如果浏览器/选项卡关闭且用户没有按顺序注销,则注销用户

时间:2014-02-15 00:52:21

标签: php

我设法在15分钟不活动后获取查询以更新数据库并注销用户。但是当用户登录并关闭浏览器时,他们将在下次登录网站时才会被注销。我怎么能这样做,即使他们关闭浏览器,数据库仍然会以某种方式更新?

// log out the user after 60 seconds of inactivity
    if (isset($_SESSION['timestamp'])) {
        $elapsed_time = time() - $_SESSION['timestamp'];
        if ($elapsed_time >= 900) {
            mysql_query("UPDATE `users` SET `status` = '0' WHERE `user_id` = '$session_user_id'");
            session_destroy();
            header('Location:index.php');
        }
    }
    $_SESSION['timestamp'] = time();

此时,如果用户登录并关闭浏览器,它们将显示为永久登录

3 个答案:

答案 0 :(得分:1)

Marc B建议您应该"在您的系统上运行预定的工作,以退出任何闲置时间超过设定时间的人员#34; - 但是,当会话处理程序中的垃圾收集执行时,这没有什么不同。

我同意Sverri的说法,当你需要追踪用户的最后一项活动时,你不应该使用一个单独的状态变量。

如果是我,我会在会话管理器层实现逻辑 - 并拒绝加载过期的会话。

答案 1 :(得分:0)

您可以更新用户的活动,只需使用上一个时间戳。你也可以运行一个会更新它的工人

答案 2 :(得分:0)

执行onUnload脚本

一种选择是每次卸载文档时执行JavaScript:

<body onunload="ajaxDoLogoff()">

function ajaxDoLogoff() {

   xmlhttp.open( "GET", "performLogoff.php", false );
   xmlhttp.send();

}

跟踪用户的活动并使所有非活动用户无效

或者向保存unix时间戳的用户lastActivity INT(11)添加字段table

如果用户登录登录用户返回,请跟踪他的活动:

$query = 'UPDATE `users` '
       . '   SET `status`         = "1",  '
       . '       `lastActivity`   = "' . $time() . '" '
       . ' WHERE ( `userID`       = "' . $userID . '" ) '
       ;

mysql_query( $query );

经常清理过时的会话:

$deadSessionTimestamp = time() - $thresholdInSeconds;

$query = 'UPDATE `users` '
       . '   SET `status` = "0" '
       . ' WHERE ( `lastActivity` < "' . $deadSessionTimestamp . '" ) '
       ;

mysql_query( $query );

副作用:应用程序现在跟踪每个用户的上一个活动。

奖励:显示登录操作的最后活动日期/时间

使用此查询

$query = 'SELECT `lastActivity ` '
       . ' WHERE ( `userID` = "' . $userID . '" ) '
       ;

如果用户提交用户ID /密码,您可以告诉他上次登录的日期/时间。