Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php session.gc_maxlifetime是否指定自上次更改单个会话变量以来的最大生存期?_Php_Session - Fatal编程技术网

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

Php session.gc_maxlifetime是否指定自上次更改单个会话变量以来的最大生存期?,php,session,Php,Session,我正在使用一个基于java的上传结构,我试着在晚上运行它 它基本上存储服务器硬盘上的所有内容(/var/www/private/$userId) 确保数据格式正确 然后将其传递到永久存储器(AmazonS3) 步骤1完成后,我运行以下代码: if($_SESSION['userId']) {//Makes sure that data is well-formed} else {echo 'you are not logged in';} 我试着运行了四个小时,结果发现您没有

我正在使用一个基于java的上传结构,我试着在晚上运行它

  • 它基本上存储服务器硬盘上的所有内容(/var/www/private/$userId)
  • 确保数据格式正确
  • 然后将其传递到永久存储器(AmazonS3)
  • 步骤1完成后,我运行以下代码:

    if($_SESSION['userId'])
        {//Makes sure that data is well-formed} 
    else
        {echo 'you are not logged in';}
    
    我试着运行了四个小时,结果发现
    您没有登录
    打印到屏幕上

    以下是cgi php.ini文件中的相应指令(我将ubuntu 12.04与apache2一起使用)

    除了
    session.gc\u probability
    session.gc\u maxlifest
    之外,大多数指令都是默认指令

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

    在浏览器中创建一个后台JavaScript进程,该进程向服务器发送常规心跳。每隔5或10分钟重新生成一个具有定时过期的新cookie

    所以我决定这么做

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

    我要测试一下这个上传,大概需要4个小时。然而,我只是读了下面的内容

    通常,您可以说session.gc\u maxlifest指定自上次更改会话数据以来的最大生存期(不是上次调用session\u start时的最大生存期)

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

    session_start(); 
    $_SESSION['userId'] = $_SESSION['userId'];
    $_SESSION['firstName'] = $_SESSION['firstName'];
    $_SESSION['lastName'] = $_SESSION['lastName'];
    
    或者我可以只重置一个值吗

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

    使其他三个不会过期?

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


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

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


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

    +1。我要补充的是,避免会话文件被其他进程或其他具有不同gc设置的php脚本擦除的一个好方法是通过设置
    session.save_path
    @rambocoder-将它们保存到一个隐蔽的不可通过web访问的目录中。save_path只会为
    session.save_path
    指令设置一个不同的路径“其他进程”?我如何确定这些进程可能是什么?是的,它会起作用。我不知道如何找到进程-我不是一个系统管理员,但我想你可以设置一些日志,记录哪些进程调用stat()或unlink()gc过程中涉及的其他操作系统级调用。但是,除了清理tmp文件夹的cron作业之外,可能的罪魁祸首是其他php脚本使用不同配置在同一共享webserver上调用会话_start()。从何时开始的最长时间?会话创建或会话_start()的最后一次调用?+1.我要补充一点,避免会话文件被其他进程或其他具有不同gc设置的php脚本擦除的一个好方法是通过设置
    session将它们保存到一个隐蔽的不可通过web访问的目录中。save_path
    @rambocoder-只会为
    session.save_path
    指令设置一个不同的路径来防止这些操作。”其他进程?我如何确定这些进程可能是什么?是的,它会起作用。我不知道如何找到这些进程-我不是一个系统管理员,但我想你可以设置一些日志,记录哪些进程调用stat()或unlink()gc过程中可能涉及的其他操作系统级调用。但是,除了清理tmp文件夹的cron作业之外,可能的罪魁祸首是其他php脚本在同一共享webserver.max上使用不同配置调用会话_start(),从何时开始?会话创建还是会话_start()的最后一次调用?
    session_start(); 
    $_SESSION['lastHeartbeat'] = time();