以下是我的php代码,如果用户不活动,则应在一小时后unset
所有session
。但是几分钟不活动后,它unset
所有变量session
。它应该是一个小时的不活动。
function timeout(){
if(session_id() == '') {
session_start();
}
global $loginUrl;
$host = $_SERVER['HTTP_HOST'];
$sessinTime = $_SESSION['timeout'] = time();
$session = isset($_SESSION['timeout']) ? $_SESSION['timeout'] : $sessinTime;
if($session + (60 * 60 * 2) < time()) {
unset($_SESSION['front_username']);
unset($_SESSION['front_password']);
unset($_SESSION['user_id']);
unset($_SESSION['timeout']);
echo "<div class='error'>Session is expired. <a href='$loginUrl'>Login again.</a></div>";
//echo "<div class='error'>Session is expired. <a href='https://gc1-4.com/acc1/login.php'>Login again.</a></div>";
exit();
}
$_SESSION['timeout'] = time();
}
当用户登录时,我在变量中注册time()
session
。这是代码:
$_SESSION['front_username'] = $username;
$_SESSION['front_password'] = $password2;
$_SESSION['user_id'] = $userid;
$_SESSION['timeout'] = time();
你能告诉我我的代码是对还是错吗?我该如何解决?谢谢。
你刚刚犯了一个小的赋值错误:
$sessinTime = $_SESSION['timeout'] = time();
此行将重置初始时间,应变为:
$sessinTime = $_SESSION['timeout'];
$sessinTime = $_SESSION['timeout'] = time();
$session = isset($_SESSION['timeout']) ? $_SESSION['timeout'] : $sessinTime;
if($session + (60 * 60 * 2) < time()) {
所以嗯:
- 将当前系统时间分配给
$_SESSION['timeout']
- 因此,第二行中的三元始终返回"true"部分,将当前时间分配给
$session
。即使它是假的,它也会从前一行分配相同的值,因为$sessinTime
和$_SESSION['timeout']
在那里相互复制。 - 因此,第三行中的条件始终为 false,并且您的代码永远不会运行 - 它永远不会比现在晚两个小时
就像现在一样,代码永远不会重置。您可能会看到其他内容,例如会话 cookie 生命周期较短,或者其他地方的流氓代码破坏了会话。
此外,这部分的构造相当危险:
if(session_id() == '') {
session_start();
}
检查是不需要的,可能会严重破坏事情。只要打电话session_start()
就好了。