【发布时间】:2015-04-15 05:07:10
【问题描述】:
我编写了这段代码来管理会话,以便它们在浏览器关闭或用户在定义的时间(2 小时)内不活动时过期。然而,似乎会话在 40 分钟不活动后到期,我真的不明白这怎么可能。如果我的代码失败,我希望它们应该持续 1440 秒(24 分钟)。
define("MY_SESSION", "mysession");
define("SESSION_DURATION", 7200);
function my_session_start() {
if (session_status() != PHP_SESSION_NONE)
return;
ini_set('session.gc_maxlifetime', SESSION_DURATION);
ini_set('session.cookie_lifetime', 0);
session_set_cookie_params(0);
session_name(MY_SESSION);
session_start();
if ((!isset($_SESSION['EXPIRES'])) || ($_SESSION['EXPIRES'] < time())) {
$_SESSION = array();
session_unset();
session_destroy();
session_start();
}
$_SESSION['EXPIRES'] = time() + SESSION_DURATION;
if (isset($_SESSION['REGENERATE'])) {
$_SESSION['REGENERATE']++;
if ($_SESSION['REGENERATE'] >= mt_rand(90,100)) {
$_SESSION['REGENERATE'] = 0;
session_regenerate_id(true);
}
}
else {
$_SESSION['REGENERATE'] = 0;
session_regenerate_id(true);
}
}
我在每个 PHP 文件中放置了my_session_start()。
我在共享服务器上,但ini_set() 未被阻止,通过在my_session_start() 之后启动phpinfo(),我可以看到session.gc_maxlifetime 本地值被设置为7200(而主值是1440)。 session.gc_probability 和 session.gc_divisor 保留其默认值(分别为 1 和 100)。
我还在 90-100 个页面加载/AJAX 调用的随机基础上重新生成会话 ID,但这并不重要,因为我也尝试注释掉该部分,但它并没有解决问题。
那么,我的代码有问题吗?分钟数从何而来,我的意思是为什么是 40 分钟?
【问题讨论】:
-
在 [how to expire PHP session after 30m][1] 上查看此答案。 [1]:stackoverflow.com/questions/520237/…
-
这几乎就是我对我的代码所做的事情,问题肯定不是来自除数和概率,因为我至少尝试了 5 次:39 分钟不活动 -> 会话活动,41 分钟不活动 - > 会话已死。仍然想知道为什么,为什么要 40 分钟
-
40 分钟谜团解开:根据所附文章中的评论,我在主机服务器上观看了“会话文件”。 40分钟后,它消失了。在共享帐户上,我们的网络主机似乎在这些会话文件夹上设置了自定义 cron 作业。这就解释了为什么重定向
save_path有效——它将会话文件从他们的cron 作业solutionfactor.net/blog/2014/02/08/… 下取出(并为启动canvas.seattlecentral.edu/courses/980464/pages/… 产生一些额外的安全性)。