PHP - ini_set('session.gc_maxlifetime', 5) - 为什么它不结束会话?

2022-08-30 21:38:06

PHP 脚本如下所示:

<?php // continue.php
ini_set('session.gc_maxlifetime', 5);
session_start();
echo ini_get('session.gc_maxlifetime');
// wait for 7 seconds
usleep(7000000);
if (isset($_SESSION['username']))
{
    $username = $_SESSION['username'];
    $password = $_SESSION['password'];
    $forename = $_SESSION['forename'];
    $surname  = $_SESSION['surname'];

    echo "Welcome back $forename.<br />
          Your full name is $forename $surname.<br />
          Your username is '$username'
          and your password is '$password'.";
}
else echo "Please <a href=authenticate2.php>click here</a> to log in.";

?>

根据超时(即 5 秒),脚本不应打印任何内容。但是,我仍然收到以下消息

5Welcome back Bill. Your full name is Bill Smith. Your username is 'bsmith' and your password is 'mysecret'.

似乎ini_set行('session.gc_maxlifetime',5)不能正常工作。我正在使用windowsXP + XAMMP。

你能告诉我如何让它工作吗?

谢谢


答案 1

即使垃圾回收器启动并删除了您打开/读取的会话文件,它也不会进入该特定PHP进程的内脏并删除对象数组。session_start()$_SESSION

假设您使用的是基于文件的标准会话处理程序(其中包含 的 'd 副本 ),下面是发生的情况。serialize()$_SESSION

  1. 会话文件位于其临时目录中
  2. 您,导致PHP打开/锁定文件,读取其内容,反序列化数据,并且顺便说一句,可能会更新会话文件的“上次使用”时间戳(Unix框上的atime)。session_start()
  3. 如果星星和月亮与第五宫的海王星上升正确对齐,则会话垃圾回收器可能会启动并删除旧的会话文件。
  4. 垃圾回收器将愉快地循环访问会话目录,并删除任何早于max_liftime的文件,但不会删除当前打开/正在使用的任何文件。由于您尚未关闭会话,因此会话的文件仍在使用中,因此不会被删除。

现在,如果您执行了类似操作:

ini_set(...); // set GC probability to max, short session lifetime, etc...

session_start(); // populate $_SESSION
session_write_close(); // dump $_SESSION out to file, close file, release lock.

sleep(7); // Sleep for 7 seconds;

session_start(); // re-populate $_SESSION;

现在,如果垃圾回收器决定启动,您可能最终会得到一个新的空白_SESSION美元。但是,除非您执行第二项操作,否则来自上一个 start() 调用的旧 $_SESSION 数据仍将存在。会话文件可能已被丢弃,但垃圾回收器在运行时不会触及脚本内存中存在的内容。session_start()


答案 2

session.gc_maxlifetime是秒数,在此秒数之后,将考虑对会话进行垃圾回收。

然后,session.gc_probability和session.gc_divisor确定在任何会话初始化时执行垃圾回收的概率


推荐