使用php一小时后会话未设置无效?

时间:2014-12-30 11:18:01

标签: php

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

你能告诉我我的代码是对还是错?我该如何解决?谢谢。

2 个答案:

答案 0 :(得分:1)

你刚刚做了一个小作业错误:

$sessinTime = $_SESSION['timeout'] = time();

此行将重置初始时间,并应变为:

$sessinTime = $_SESSION['timeout'];

答案 1 :(得分:1)

$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,并且您的代码永远不会运行 - 它现在比现在晚两个小时
  4. 现在,代码从不重置。您可能会看到其他内容,例如短会话cookie生命周期或其他地方的流氓代码会破坏会话。

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

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

    检查是不必要的,可能会破坏可怕的事情。只需致电session_start()