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

时间:2012-06-18 05:22:07

标签: php session

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

  1. 它基本上将所有内容存储在服务器的硬盘上(/ var / www / private / $ userId)
  2. 确保数据格式正确
  3. 然后将其传递到永久存储(Amazon S3)。
  4. 在第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除外。

    我正试图解决这个问题,并且遇到了一个非常有用的博客,杰夫从中推断,如果浏览器内网站上的一段时间不活动,浏览器会导致存储在浏览器中的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();
    

    以便其他三个不会过期?

1 个答案:

答案 0 :(得分:4)

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

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