使用PHP注销非活动用户

时间:2015-06-04 09:24:28

标签: php mysql logout

我试图在一段时间后将用户从我的CMS中注销。通过非活动,我的意思是没有点击鼠标或键入键盘。因此,在30分钟不活动后,我的注销功能就会运行。

我正在使用的CMS内置了一个注销功能 -

<?php
session_start();
if (isset($_SESSION['user_id'])){
    $login = 1;
}else{
    $login = 0;
}

function confirm_logged_in() {
    if (!isset($_SESSION['user_id'])) {
        //redirect
        header("Location: /_cms/login.php?login=0");
    }
}
function logout(){
        $_SESSION = array();
        if(isset($_COOKIE[session_name()])){
            setcookie(session_name(), '', time()-4200, '/');
        }   
        session_destroy();
}

?>

其他人写了这段代码并且有效。但是,我不知道注销非活动用户所需的确切时间。预设时间是 - 4200.我想知道的是退出需要多长时间,以及我是否可以将其更改为我想要的任何时间。有人可以建议吗?

2 个答案:

答案 0 :(得分:1)

-4200只是为了销毁cookie。通过为他们设置过去的时间来销毁Cookie。因此,向后设置4200秒与向后设置一秒有效。

要注销用户,有多种方法。您可以使用上一个活动时间设置自己的cookie(每次用户访问页面时设置时间)。在每个脚本的开头包括一个函数,它获取此cookie并检查应包含最后一个活动时间的值。如果此时间早于允许的非活动时间,则销毁此cookie并销毁会话,如果没有,则将值更新为当前时间。

当然,您也可以在会话内部存储最后一个活动时间,这是一种更有效的方法,可以消除cookie传输和管理的开销。

修改

以下是检查上一个活动时间并注销用户的最小代码:

function login(){
    //check login username/pass etc...
    $_SESSION['last_active_time'] = time();
}

function auth(){
   if($_SESSION['last_active_time'] < (time() - 1800)){ //1800 is 30 minutes (time in seconds)
        logout(); //destroy the session in the logout function
    }
    else{
        $_SESSION['last_active_time'] = time();
    }
   //do some auth related things
}

这是这背后的基本逻辑。当然,您需要实现其他所需的东西以及安全性,检查等....

答案 1 :(得分:0)

我会尝试回答你的问题并提出一些问题。

  1. 您使用的CMS是什么?如果您可以命名CMS,我们可以提供详细而准确的解决方案
  2. 关于您的功能退出()以及 setcookie和-4200 ,无论何时调用注销功能,都会检查是否存在是任何coockie集。如果是,则只是将 EXPIRY TIME 设置为4200秒前,即从当前时间开始7分钟前。即。它使目前存在的Coockie无效。 请参阅链接:http://php.net/manual/en/function.setcookie.php
  3. 现在,您想要的是在30分钟不活动后,用户应该退出。您当前的代码不是为此而构建的。您应编写逻辑以继续检查上一个活动时间,如果超过30分钟,则应调用注销功能。现在的问题是,该怎么办?我只是稍微修改你的代码

    if (isset($_SESSION['user_id'])){
        $login = 1;
        // If the user has performed action within 30 minutes
        if($_SESSION['last_active_on'] > (time() - (30*60))){
            $_SESSION['last_active_on'] = time();   // Re-set the current time as Last Active
        }else{
            // User has done some action after 30 minutes.
            logout();   // Invoke the Logout functionality
        }    
    }else{
        $login = 0;
    }
    
  4. 请记住: time()返回自Unix Epoch(1970年1月1日00:00:00 GMT)以来的秒数测量的当前时间。

    您尚未在此处添加登录功能。你应该修改你的登录功能,并且应该再添加一行 $_SESSION['last_active_on'] = time();

    还有一件事。只有在将请求发送到服务器时才会发生这一切。例如:假设在下午4:00,由于某些操作,有一个服务器调用。假设在4:25您正在移动鼠标光标或单击页面上的任何位置,但如果它没有向服务器发送任何请求,则认为它本身处于非活动状态。并且在下午4:35如果用户做了将请求发送到服务器[正常请求或Ajax]的事情, 然后根据服务器,它是35分钟无效状态,因此它将注销。希望这能回答你的问题。

    您甚至可以参考SO问题:User Inactivity Logout PHP它也可以帮助您。