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