首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP - ini_set('session.gc_maxlifetime',5) -为什么它不结束会话?

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

Stack Overflow用户
提问于 2010-08-07 06:08:15
回答 4查看 43.5K关注 0票数 18

PHP脚本如下:

代码语言:javascript
复制
<?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秒),脚本不应打印任何内容。但是,我仍然收到以下消息

代码语言:javascript
复制
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。

你能告诉我怎么用吗?

谢谢

EN

回答 4

Stack Overflow用户

发布于 2010-08-07 11:23:53

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

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

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

现在,如果你这样做:

代码语言:javascript
复制
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中旧的数据仍将出现在中。会话文件可能已被丢弃,但垃圾收集器在运行时不会触及脚本内存中的内容。

票数 39
EN

Stack Overflow用户

发布于 2010-08-07 06:15:32

session.gc_maxlifetime是一个秒数,在该秒数之后,会话将被视为用于垃圾收集的。

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

票数 9
EN

Stack Overflow用户

发布于 2010-08-07 06:13:20

阅读manual (重点是我的):

session.gc_maxlifetime指定了多少秒后,数据将被视为“垃圾”,并且可能会清理。垃圾收集可能发生在会话启动期间(取决于session.gc_probabilitysession.gc_divisor)。

在同一页中:

结合了session.gc_probability

session.gc_divisor定义了在每次会话初始化时启动gc (垃圾收集)进程的概率。通过使用gc_probability/gc_divisor计算概率,例如1/100表示GC进程在每个请求上启动的概率为1%。session.gc_divisor默认为100。

现在计算一下,发现GC不太可能在每个请求上都被调用。

您应该在会话中存储一个变量,用于保存用户最后一次活动的时间,并使用该变量代替会话在逻辑上处于“活动”状态。不要依赖垃圾收集。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3428153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档