使用PHP注销非活动用户


Logout an inactive user using PHP

我试图在一段时间后将用户从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。我想知道的是注销需要多长时间,以及我是否可以将其更改为我想要的任何时间。有人能给点建议吗?

-4200只是销毁cookie。Cookies会通过设定过去的时间而被破坏。所以向后设置4200秒和向后设置1秒一样有效。

有多种注销用户的方法。您可以设置自己的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. 您使用的CMS是什么?如果您可以命名CMS,我们可以提供详细准确的解决方案
  2. 关于logout()函数和setcookie和-4200,当你调用logout函数时,它会检查是否有cookie集。如果是,那么它只是将 expiration TIME设置为4200秒前,即从当前时间开始的7分钟前。ie。它使当前存在的cookie无效。参考链接:http://php.net/manual/en/function.setcookie.php
  3. 现在,您想要的是30分钟不活动后,用户应该注销。您当前的代码不是为此而构建的。您应该编写逻辑来持续检查最后一次活动时间,并且如果活动时间超过30分钟,应该调用logout函数。现在的问题是,该怎么做?我只是修改你的代码一个位

    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;
    }
    

记住:time()返回从Unix Epoch(1970年1月1日00:00:00 GMT)开始以秒数测量的当前时间。

您还没有在这里添加login函数。您应该修改您的登录功能,并在as中再添加一行$_SESSION['last_active_on'] = time();

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

您甚至可以参考SO问题:用户不活动注销PHP它也可能对您有所帮助。