【问题标题】:how to expire php session if user is inactive for 15 mins如果用户处于非活动状态 15 分钟,如何使 php 会话过期
【发布时间】:2012-02-25 19:54:24
【问题描述】:

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

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

session_start();

为了销毁这个会话,我在 logout.php 文件中写了下面一行。

session_destroy();

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

我想要的是如果用户 15 分钟不活动,会话应该过期。

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

【问题讨论】:

标签: php session


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    /* 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 关于代码插入的位置是正确的。一部分作为函数,另一部分在每个文件的标头或公共标头函数中。

    【讨论】:

      【解决方案3】:

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

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

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

      函数 sessionTimeOut() {

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

      if ($_SESSION['timeout'] + 900 > 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();检查用户是否登录后在标题中调用函数。这允许每次用户刷新或导航到新页面时调用该函数。因此,它完美地工作(至少在我的情况下),实现了我的目的,所以我想我会与你们分享。

      【讨论】:

        【解决方案4】:

        在你的头文件中调用下面的函数,这样每当用户在那个时候进行任何活动时页面都会被刷新并检查会话是否超时。

        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 秒。如果不是,则设置新的会话时间。”您可以根据需要更改时间 diff(1500)。

        【讨论】:

        • 只有一个问题 kamal,我如何创建一个名为 user_time 的会话,因为我以前只是写 session_start()
        • 你需要写 $_SESSION['name'];
        【解决方案5】:

        试试

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

        在调用 session_start() 之前使用它

        【讨论】:

        • 如果我在我的config.php 文件中在session_start() 之前写这3 行,它将适用于我的整个项目吗?因为config.php 包含在所有其他项目文件中
        • 好的,下面是我config.php 中的代码,看看它会起作用吗? <?php ini_set('session.gc_maxlifetime',54000); ini_set('session.gc_probability',1); ini_set('session.gc_divisor',1); session_start(); $link = mysql_connect('localhost','root'); mysql_select_db('dbname',$link) or die("Not Able To Connect To DataBase"); ?>
        • 我在 config.php 中编写了以下代码用于测试目的<?php ini_set('session.gc_maxlifetime',3600); ini_set('session.gc_probability',1); ini_set('session.gc_divisor',1); session_start(); $link = mysql_connect('localhost','root'); mysql_select_db('dbname',$link) or die("Not Able To Connect To DataBase"); ?> 这意味着会话应该在1 min 到期,但我没有
        • 我也试过这个解决方案——对我也不起作用。
        【解决方案6】:

        你可以使用这样的东西

        # 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

        【讨论】:

        • 如果我只在我的config.php 文件中编写此代码,这是否适用于整个项目,因为我的config.php 包含在所有其他项目文件中??
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-20
        相关资源
        最近更新 更多