Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.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 会话变量仅在时间流逝后丢失_Php_Arrays_Session Variables - Fatal编程技术网

Php 会话变量仅在时间流逝后丢失

Php 会话变量仅在时间流逝后丢失,php,arrays,session-variables,Php,Arrays,Session Variables,这两个页面是大型PHP应用程序中页面的精简版本page1调用一个函数(在应用程序中,f执行SQL),该函数返回一个两元素数组、一个字符串和一个数组。然后,它将返回变量的数组部分放入会话变量中,并显示指向page2的链接page2将会话变量分配给局部变量。但是 如果立即单击链接,则一切正常。如果在单击之前超过5-10分钟(变化),则第二个页面无法找到会话变量,并抛出“未定义索引”错误 这对我来说是违反直觉的,但对更熟悉PHP的人来说可能不是。我尝试过禁用垃圾收集,但结果是一样的。有人能解释一下会话

这两个页面是大型PHP应用程序中页面的精简版本page1调用一个函数(在应用程序中,f执行SQL),该函数返回一个两元素数组、一个字符串和一个数组。然后,它将返回变量的数组部分放入会话变量中,并显示指向page2的链接page2将会话变量分配给局部变量。但是

如果立即单击链接,则一切正常。如果在单击之前超过5-10分钟(变化),则第二个页面无法找到会话变量,并抛出“未定义索引”错误

这对我来说是违反直觉的,但对更熟悉PHP的人来说可能不是。我尝试过禁用垃圾收集,但结果是一样的。有人能解释一下会话变量丢失的原因吗

page1.php

<?php
    session_start();
    function f() {
        $rtnValue = array ( 'error' => null, 'table' => array() );
        $rtnValue['error'] = '';
        $rtnValue['table'] = array('a','b','c');
        return $rtnValue;
    }
    $result = f();
    $dataTable = $result['table'];
    $_SESSION['termTable'] = $dataTable;
?>
<html>
    <body>
        <a href="page2.php">Go to page2.php</a>
    </body>
</html>
<?php
    session_start();
    function customError($errno, $errstr, $errfile, $errline) {
        echo "ERROR ", $errno, ": ", $errstr, " in ", $errfile, " at line ", $errline;
        exit();
    }
    error_reporting(E_ALL);
    set_error_handler('customError');
    $dataTable2 = $_SESSION['termTable'];
    // Undefined index: termTable in D:\www\hr\_DEV\PHP\sessionError\page2.php at line 9
?>
<html>
    <body>
        Okay
    </body>
</html>

page2.php

<?php
    session_start();
    function f() {
        $rtnValue = array ( 'error' => null, 'table' => array() );
        $rtnValue['error'] = '';
        $rtnValue['table'] = array('a','b','c');
        return $rtnValue;
    }
    $result = f();
    $dataTable = $result['table'];
    $_SESSION['termTable'] = $dataTable;
?>
<html>
    <body>
        <a href="page2.php">Go to page2.php</a>
    </body>
</html>
<?php
    session_start();
    function customError($errno, $errstr, $errfile, $errline) {
        echo "ERROR ", $errno, ": ", $errstr, " in ", $errfile, " at line ", $errline;
        exit();
    }
    error_reporting(E_ALL);
    set_error_handler('customError');
    $dataTable2 = $_SESSION['termTable'];
    // Undefined index: termTable in D:\www\hr\_DEV\PHP\sessionError\page2.php at line 9
?>
<html>
    <body>
        Okay
    </body>
</html>

可以

检查php.ini以检查会话保持活动的时间:

session.cookie_lifetime = 300
您可以使用以下命令在运行时对其进行设置:

会话设置cookie参数


您的会话处理程序是什么?如果文件:您是在共享主机上还是在基于debian的系统上?如果memcache(d):memcached的当前用途是什么,是否正在进行清洗?如果其他:哪个?共享整个
会话
部分
phpinfo()
可能是明智的,因为它可以是很多东西。phpinfo()不返回任何内容。管理员禁用了吗?什么都没有?它通常应该只提供一个完整的HTML页面和您的所有设置。。。奇怪的但是:
变量转储(ini\u get\u all('session')是什么然后显示给我们?太长,无法发表评论。正常,超时正常,文件处理程序,和作为会话存储路径的
D:\PHP5\SessionData
。问题:会话中的单个键是空的,还是整个会话都是空的?如果是那个单键:很可能是某个地方的代码问题,请检查您的访问日志以及可能从您的IP运行的其他请求。如果您的整个会话都结束了:您是否使用共享主机,是否有人定义了较低的会话超时,并使用相同的文件夹进行会话存储,这将使他的垃圾处理程序删除您的会话。如果是这样,请尝试另一个可写目录作为会话存储路径。ini_get('session.cookie_lifetime')返回0 session.gc_maxlifetimessession.gc_maxlifetime为2400(40分钟)。我还尝试了在不做任何更改的情况下禁用gc_。尝试使用以下命令将会话保存路径更改为您唯一使用的路径(以排除与其他用户共享的问题):会话保存路径('/home/path/local.com/tmp');