【问题标题】:Does session.gc_maxlifetime specify the maximum lifetime since the last change of a single session variable?session.gc_maxlifetime 是否指定了自上次更改单个会话变量以来的最大生命周期?
【发布时间】:2012-06-20 02:16:57
【问题描述】:

我正在使用基于 java 的上传构造 http://www.javaatwork.com/java-upload-applet/details.html,我尝试在夜间运行。

  1. 它基本上将所有内容都存储在服务器的硬盘上 (/var/www/private/$userId)
  2. 确保数据格式正确
  3. 然后将其传递到永久存储 (Amazon S3)。

第 1 步完成后,我运行以下代码:

if($_SESSION['userId'])
    {//Makes sure that data is well-formed} 
else
    {echo 'you are not logged in';}

我尝试运行它四个小时,却发现you are not logged in 打印到屏幕上。

以下是 cgi php.ini 文件中的相应指令(我使用的是 ubuntu 12.04 和 apache2。)

session.gc_probability = 0
session.gc_divisor = 1000
session.gc_maxlifetime = 14400 //this is 30 hours, which is far greater than the 4 hours it was running
session.cache_expire = 1800
session.cookie_lifetime = 0

除了session.gc_probabilitysession.gc_maxlifetime 之外,大多数这些指令都是默认的。

我正在尝试解决此问题,并遇到了 Jeff 的一个非常有用的博客,我从中推断,如果浏览器内的网站一段时间不活动,浏览器可能会导致存储在浏览器中的 PHPSESSID cookie 被删除.他建议

“在浏览器中创建一个后台 JavaScript 进程,定期向服务器发送心跳。重新生成一个具有定时过期的新 cookie,例如,每 5 或 10 分钟一次。” http://www.codinghorror.com/blog/2008/04/your-session-has-timed-out.html

所以我决定这样做。

function myTimeoutFunction()
{
    $.ajax({
        url: "heartbeat.php",                    
        success: function() {
        }
    });
    setTimeout(myTimeoutFunction, 15*60*1000);
}
myTimeoutFunction();

heartbeat.php <?php session_start(); ?>

我将对此进行测试,以便上传大约需要 4 小时。但是我刚刚阅读了以下内容

通常你可以说 session.gc_maxlifetime 指定自上次更改会话数据以来的最大生命周期(不是上次调用 session_start 时)

https://stackoverflow.com/a/1516338/784637

如果我有 3 个会话变量 $_SESSION['userId'] $_SESSION['firstName'] $_SESSION['lastName'],我是否需要重置它们在 heartbeat.php 中的所有值

session_start(); 
$_SESSION['userId'] = $_SESSION['userId'];
$_SESSION['firstName'] = $_SESSION['firstName'];
$_SESSION['lastName'] = $_SESSION['lastName'];

或者我可以只重置一个值

session_start(); 
$_SESSION['lastHeartbeat'] = time();

这样其他三个就不会过期了?

【问题讨论】:

    标签: php session


    【解决方案1】:

    PHP 会话保持为一个整体; $_SESSION 中的任何更改都会更新更改时间,并通过扩展保留整个会话。

    关于实际问题:PHP 不应该在达到最大时间之前 GC 会话,但这并不意味着 PHP 总是清除它。默认情况下,会话保存在 /tmp(或其他)目录中,并且某些 Linux 发行版将具有可能不时清理文件夹的 cron 作业。检查 crons 或其他可能清除独立于 PHP 的会话的东西。

    【讨论】:

    • +1。我将补充一点,避免会话文件被其他进程或其他具有不同 gc 设置的 php 脚本擦除的好方法是通过设置 session.save_path 将它们保存到一个隐蔽的不可 Web 访问目录
    • @rambocoder - 仅仅为session.save_path 指令设置不同的路径会阻止那些“其他进程”吗?我将如何确定这些过程可能是什么?
    • 是的,它会起作用的。我不知道如何找到进程 - 我不是系统管理员,但我想你可以设置一些记录哪些进程调用 stat() 或 unlink() 其他操作系统级别的调用参与gc过程。但是,除了清理 tmp 文件夹的 cron 作业之外,一个可能的罪魁祸首是其他 php 脚本在同一个共享网络服务器上使用不同的配置调用 session_start()。
    • 从什么时候开始的最大时间?会话创建还是最后一次调用 session_start()?
    猜你喜欢
    • 2017-06-23
    • 2017-09-04
    • 2014-01-02
    • 1970-01-01
    • 2017-05-20
    • 2021-01-03
    • 2023-03-03
    • 2018-04-30
    • 1970-01-01
    相关资源
    最近更新 更多