我试图在一段时间后将用户从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
}
这就是背后的基本逻辑。当然,您还需要实现安全、检查等所需的其他东西....
我会尽量回答你的问题,也有一些问题。
- 您使用的CMS是什么?如果您可以命名CMS,我们可以提供详细准确的解决方案
- 关于logout()函数和setcookie和-4200,当你调用logout函数时,它会检查是否有cookie集。如果是,那么它只是将 expiration TIME设置为4200秒前,即从当前时间开始的7分钟前。ie。它使当前存在的cookie无效。参考链接:http://php.net/manual/en/function.setcookie.php
-
现在,您想要的是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它也可能对您有所帮助。