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

24 浏览
0 Comments

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

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

admin 更改状态以发布 2023年5月25日
0
0 Comments

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

注意:如果您想更改时间,请将30更改为所需的时间,不要更改*60:这将为分钟。


以分钟为单位:(30 * 60)
以天为单位:(n * 24 * 60 * 60)n = 天数


Login.php



    
Username
Password

HomePage.php

Click Here to Login";
    }
    else {
        $now = time(); // Checking the time now when home page starts.
        if ($now > $_SESSION['expire']) {
            session_destroy();
            echo "Your session has expired! Login here";
        }
        else { //Starting this else one [else1]
?>
            
            
                Welcome
                Log out";
                ?>
            

LogOut.php


0
0 Comments

你应该自己实现会话超时功能。其他人提到的两个选项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文件系统或任何其他文件系统中,其中无法跟踪atime,则必须想出另一种处理垃圾回收会话的方法。自PHP 4.2.3以来,它使用mtime(修改日期)而不是atime。因此,您将不会遇到无法跟踪atime的文件系统的问题。

因此,当会话数据长时间未被更新时,会话数据文件可能会被删除,但会话本身仍被视为有效。

其次:

session.cookie_lifetime
session.cookie_lifetime指定发送到浏览器的cookie的生存时间(以秒为单位)。[...]

是的,这仅影响cookie的生存时间,而会话本身仍可能有效。但是,使会话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活动。
0