30分钟后如何过期PHP会话?

我需要保持一个会话30分钟,然后销毁它。


你应该实现你自己的会话超时。 其他人提到的两个选项(session.gc_maxlifetime和session.cookie_lifetime)都不可靠。 我会解释原因。

第一:

的session.gc_maxlifetime
session.gc_maxlifetime指定数据将被视为“垃圾”并清理后的秒数。 垃圾收集发生在会话开始时。

但垃圾收集器仅以session.gc_probability除以session.gc_divisor的概率开始。 使用这些选项的默认值(分别为1和100),机会仅为1%。

那么,你可以简单地调整这些值,以便更频繁地启动垃圾收集器。 但是当垃圾回收器启动时,它会检查每个注册会话的有效性。 这是成本密集型的​​。

此外,当使用PHP的默认session.save_handler文件时,会话数据将存储在session.save_path中指定的路径中的文件中。 使用该会话处理程序,会话数据的年龄根据文件的上次修改日期而不是上次访问日期进行计算:

注意:如果您使用默认的基于文件的会话处理程序,则文件系统必须跟踪访问时间(atime)。 Windows FAT不会让你必须想出另一种方式来处理垃圾收集会话,如果你坚持使用FAT文件系统或任何其他文件系统的时间跟踪不可用。 自PHP 4.2.3以来,它使用mtime(修改日期)而不是atime。 因此,您不会遇到无法使用时间跟踪的文件系统的问题。

因此,会话数据文件被删除,而会话本身仍被视为有效,因为会话数据最近未更新,所以还可能会发生此情况。

第二:

session.cookie_lifetime
session.cookie_lifetime以秒为单位指定发送给浏览器的cookie的生命周期。 [...]

恩,那就对了。 这只会影响cookie的生命周期,会话本身可能仍然有效。 但是服务器的任务是使会话无效,而不是客户端。 所以这没有任何帮助。 事实上,将session.cookie_lifetime设置为0会使会话的cookie成为仅在浏览器关闭前才有效的实际会话cookie。

结论/最佳解决方案:

最好的解决方案是实现您自己的会话超时。 使用表示最后一次活动(即请求)的时间的简单时间戳,并用每个请求更新它:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

使用每个请求更新会话数据还会更改会话文件的修改日期,以避免垃圾收集器过早地删除会话。

您还可以使用附加时间戳记定期重新生成会话ID,以避免会话注入等会话受到攻击:

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

笔记:

  • session.gc_maxlifetime应至少等于此自定义到期处理程序的生命周期(本例中为1800);
  • 如果您想要在活动30分钟后而不是30分钟后终止会话,则还需要使用setcookie且过期time()+60*30以保持会话cookie处于活动状态。

  • 30分钟内PHP会话过期的简单方法。

    注意:如果你想改变时间,只需改变你想要的时间30,不要改变* 60:这会给出分钟。


    在几分钟内:(30 * 60)
    天数:(n * 24 * 60 * 60)n =没有天数


    的login.php

    <?php
        session_start();
    ?>
    
    <html>
        <form name="form1" method="post">
            <table>
                <tr>
                    <td>Username</td>
                    <td><input type="text" name="text1"></td>
                </tr>
                <tr>
                    <td>Password</td>
                    <td><input type="password" name="pwd"></td>
                </tr>
                <tr>
                    <td><input type="submit" value="SignIn" name="submit1"></td>
                </tr>
            </table>
        </form>
    </html>
    
    <?php
        if ($_POST['submit1']) {
            $v1 = "FirstUser";
            $v2 = "MyPassword";
            $v3 = $_POST['text'];
            $v4 = $_POST['pwd'];
            if ($v1 == $v3 && $v2 == $v4) {
                $_SESSION['luser'] = $v1;
                $_SESSION['start'] = time(); // Taking now logged in time.
                // Ending a session in 30 minutes from the starting time.
                $_SESSION['expire'] = $_SESSION['start'] + (30 * 60);
                header('Location: http://localhost/somefolder/homepage.php');
            } else {
                echo "Please enter the username or password again!";
            }
        }
    ?>
    

    HomePage.php

    <?php
        session_start();
    
        if (!isset($_SESSION['luser'])) {
            echo "Please Login again";
            echo "<a href='http://localhost/somefolder/login.php'>Click Here to Login</a>";
        }
        else {
            $now = time(); // Checking the time now when home page starts.
    
            if ($now > $_SESSION['expire']) {
                session_destroy();
                echo "Your session has expired! <a href='http://localhost/somefolder/login.php'>Login here</a>";
            }
            else { //Starting this else one [else1]
    ?>
                <!-- From here all HTML coding can be done -->
                <html>
                    Welcome
                    <?php
                        echo $_SESSION['luser'];
                        echo "<a href='http://localhost/somefolder/logout.php'>Log out</a>";
                    ?>
                </html>
    <?php
            }
        }
    ?>
    

    LogOut.php

    <?php
        session_start();
        session_destroy();
        header('Location: http://localhost/somefolder/login.php');
    ?>
    

    这是否在设​​定时间后将用户注销? 在注册时设置会话创建时间(或到期时间),然后检查每个页面加载可以处理的时间。

    例如:

    $_SESSION['example'] = array('foo' => 'bar', 'registered' => time());
    
    // later
    
    if ((time() - $_SESSION['example']['registered']) > (60 * 30)) {
        unset($_SESSION['example']);
    }
    

    编辑:我有一种感觉,你的意思是别的。

    您可以使用session.gc_maxlifetime ini设置在一定的使用期限后取消会话:

    编辑: ini_set('session.gc_maxlifetime',60 * 30);

    链接地址: http://www.djcxy.com/p/21947.html

    上一篇: How do I expire a PHP session after 30 minutes?

    下一篇: complex applications