session.gc_maxlifetime是否指定自上次更改单个会话变量以来的最大生存期


Does session.gc_maxlifetime specify the maximum lifetime since the last change of a single session variable?

我正在使用一个基于 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 文件中的相应指令(我使用的是带有 apache2 的 ubuntu 12.04。

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();

心跳.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 中的任何更改都将更新更改时间,并通过扩展保留整个会话。

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