使用 PHP 一小时后未设置的会话不起作用


session unset after one hour using php is not working?

以下是我的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()) {

所以嗯:

  1. 将当前系统时间分配给$_SESSION['timeout']
  2. 因此,第二行中的三元始终返回"true"部分,将当前时间分配给$session。即使它是假的,它也会从前一行分配相同的值,因为$sessinTime$_SESSION['timeout']在那里相互复制。
  3. 因此,第三行中的条件始终为 false,并且您的代码永远不会运行 - 它永远不会比现在晚两个小时

就像现在一样,代码永远不会重置。您可能会看到其他内容,例如会话 cookie 生命周期较短,或者其他地方的流氓代码破坏了会话。

此外,这部分的构造相当危险:

if(session_id() == '') {
    session_start();
}

检查是不需要的,可能会严重破坏事情。只要打电话session_start()就好了。