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。
你能告诉我怎么用吗?
谢谢
发布于 2010-08-07 11:23:53
即使垃圾收集器启动并删除了您用PHP打开/读取的会话文件,它也不会深入到那个特定session_start()
进程的内部并删除$_SESSION
对象数组。
假设您使用的是标准的基于文件的会话处理程序(其中包含$_SESSION
的serialize()
'd副本),则会发生以下情况。
session_start()
的临时目录中,导致PHP打开/锁定文件,读取其内容,反序列化数据,并且可能顺便更新会话文件的“上次使用”时间戳( Unix盒上的atime)。现在,如果你这样做:
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,即。但是,除非您执行第二次session_start()
,否则上一次调用$_SESSION中旧的数据仍将出现在中。会话文件可能已被丢弃,但垃圾收集器在运行时不会触及脚本内存中的内容。
发布于 2010-08-07 06:15:32
session.gc_maxlifetime是一个秒数,在该秒数之后,会话将被视为用于垃圾收集的。
然后,session.gc_probability和session.gc_divisor确定在任何会话初始化时执行垃圾收集的概率
发布于 2010-08-07 06:13:20
阅读manual (重点是我的):
session.gc_maxlifetime
指定了多少秒后,数据将被视为“垃圾”,并且可能会清理。垃圾收集可能发生在会话启动期间(取决于session.gc_probability
和session.gc_divisor
)。
在同一页中:
结合了session.gc_probability
的
session.gc_divisor
定义了在每次会话初始化时启动gc (垃圾收集)进程的概率。通过使用gc_probability/gc_divisor
计算概率,例如1/100表示GC进程在每个请求上启动的概率为1%。session.gc_divisor
默认为100。
现在计算一下,发现GC不太可能在每个请求上都被调用。
您应该在会话中存储一个变量,用于保存用户最后一次活动的时间,并使用该变量代替会话在逻辑上处于“活动”状态。不要依赖垃圾收集。
https://stackoverflow.com/questions/3428153
复制相似问题