如果用户在15分钟内处于非活动状态,如何使php会话失效

时间:2012-02-03 06:27:01

标签: php session

我用PHP创建了一个项目,我正在管理会话。

我通过编写以下代码行在config.php文件中创建会话。

session_start();

并销毁此会话,在logout.php文件中我写了以下行。

session_destroy();

我没有在任何其他项目文件中提及任何会话代码,但问题是会话是活动的,直到我调用logout.php,

我想要的是如果用户在15分钟内处于非活动状态,则会话应该到期。

任何人都可以帮助我,我是PHP的新手,请提供一些示例代码或链接来实现此目的。

6 个答案:

答案 0 :(得分:15)

在头文件中调用以下函数,以便每当用户执行任何活动时,页面都会刷新并检查会话是否超时。

function auto_logout($field)
{
    $t = time();
    $t0 = $_SESSION[$field];
    $diff = $t - $t0;
    if ($diff > 1500 || !isset($t0))
    {          
        return true;
    }
    else
    {
        $_SESSION[$field] = time();
    }
}

在标题

中使用类似的内容
    if(auto_logout("user_time"))
    {
        session_unset();
        session_destroy();
        location("login.php");          
        exit;
    }       

User_time是会话名称。我希望这个答案会对你有所帮助。实际上这段代码的作用是:“检查diff是否大于1500秒。如果没有,则设置新的会话时间。”您可以根据需要更改时差(1500)。

答案 1 :(得分:4)

尝试

  ini_set('session.gc_maxlifetime',54000);  
  ini_set('session.gc_probability',1);
  ini_set('session.gc_divisor',1); 

在调用session_start()

之前使用它

答案 2 :(得分:2)

time()存储在$time变量中。创建名为$setTime的变量并设置您希望用户超时的时间。

之后检查如果$_SESSION['setTime']为空或未设置的条件,则将超时值存储到会话中,否则当页面刷新时,新值将被分配给$_SESSION['setTime']。< / p>

$time = time ();
    $setTime = time () + 60;
    if (empty ( $_SESSION ['setTime'] ) || !isset ( $_SESSION ['setTime'] )) {
        $_SESSION ['setTime'] = $setTime;
    }

之后检查当前时间是否大于存储时间。如果它未设置会话。也摧毁会议。

if (time () >= ( int ) $_SESSION ['setTime']) {
   session_unset ();
   session_destroy ();
}

答案 3 :(得分:1)

你可以使用这样的东西

# Session Logout after in activity 
function sessionX(){ 
    $logLength = 1800; # time in seconds :: 1800 = 30 minutes 
    $ctime = strtotime("now"); # Create a time from a string 
    # If no session time is created, create one 
    if(!isset($_SESSION['sessionX'])){  
        # create session time 
        $_SESSION['sessionX'] = $ctime;  
    }else{ 
        # Check if they have exceded the time limit of inactivity 
        if(((strtotime("now") - $_SESSION['sessionX']) > $logLength) && isLogged()){ 
            # If exceded the time, log the user out 
            logOut(); 
            # Redirect to login page to log back in 
            header("Location: /login.php"); 
            exit; 
        }else{ 
            # If they have not exceded the time limit of inactivity, keep them logged in 
            $_SESSION['sessionX'] = $ctime; 
        } 
    } 
} 

但请记住函数sessionX()必须在session_start()

之后

查看详情here

答案 4 :(得分:1)

我知道这是一个已回答的问题,但我只想分享我的经验,因为我觉得这是一个更简单的方法。我不确定这是不是最好的方法,但这里有。我做的是:

  1. 我在用户登录时将PHP会话($ _SESSION ['timeout'])设置为当前时间(time())。

  2. 编写以下函数以验证用户是否处于活动状态。

  3.   

    函数sessionTimeOut(){

         

    //此功能将900秒(15分钟,即您希望用户自动注销的时间自动注销)添加到用户上次处于活动状态时的先前注册时间。 //然后,它检查当前时间是否大于您希望用户//在没有超时(15分钟)的情况下保持登录的时间。如果它更大,那么您将被重定向到//登录页面,您可以在该页面上使用http://www.yourwebpage/login.php?status=timeout启动注销功能。

         

    if($ _SESSION ['timeout'] + 900&gt; time()){

      // User Active so reset time session.
      $_SESSION['timeout'] = time();
    
         

    }其他{

      // session timed out then redirect to login page
      header('Location:http://'. $_SERVER[HTTP_HOST] . '/login.php?status=timeout');
    
         

    }

         

    }

    最后:调用sessionTimeOut();检查用户是否登录后在标题中起作用。这允许每次用户刷新或导航到新页面时调用该函数。因此,它完美地工作(至少在我的情况下),实现我的目的,所以我想我只是与你们分享。

答案 5 :(得分:-1)

这是卡迈勒发布的内容的延续。我尝试了相同的代码但通过修改它使其工作如下:

/* code */
function fnlogout($field)
{
    $t = time();
    if (!isset($_SESSION[$field]))
        $_SESSION[$field] = time();
    $t0 = $_SESSION[$field];
    $diff = $t - $t0;
    if ($diff > 60)
    {        
        return true;
    }enter code here
    else
    {
        return false;
    }
}
function fnheader()
{
    if(fnlogout("user_time"))
    {
        session_unset();
        session_destroy();
        header("location:index.php?action=expired");
        exit;
    }
}

是的,Kamal对代码插入的位置是正确的。一部分作为函数,另一部分作为每个文件的标题或公共标题函数。