我有一个网站的问题,在使用Internet Explorer的特定用户中,PHP不能保存会话变量。但是对于其他一些使用Internet Explorer的用户,没有任何问题,而使用其他浏览器的用户也没有任何问题。
我创建了以下三个小脚本,以确保网站中没有涉及其他代码:
test.php:
<?php
session_start();
function logMsg($text) {
$filename = dirname(__FILE__) . "/test.log";
$fh = fopen($filename, "a") or die("Could not open log file.");
fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!");
fclose($fh);
}
ob_start();
var_dump(session_id(), $_SESSION, $_SERVER, $_REQUEST);
$content = ob_get_clean();
logMsg("test.php");
logMsg($content);
$_SESSION['test'] = array('test' => 'lalala');
$_SESSION['count'] = 1;
?>
<a href="test2.php">Next</a>
test2.php:
<?php
session_start();
function logMsg($text) {
$filename = dirname(__FILE__) . "/test.log";
$fh = fopen($filename, "a") or die("Could not open log file.");
fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!");
fclose($fh);
}
ob_start();
var_dump(session_id(), $_SESSION, $_SERVER, $_REQUEST);
$content = ob_get_clean();
logMsg("test2.php");
logMsg($content);
$_SESSION['count']++;
?>
<a href="test3.php">Next</a>
test3.php:
<?php
session_start();
function logMsg($text) {
$filename = dirname(__FILE__) . "/test.log";
$fh = fopen($filename, "a") or die("Could not open log file.");
fwrite($fh, date("d-m-Y, H:i")." - $text\n") or die("Could not write file!");
fclose($fh);
}
ob_start();
var_dump(session_id(), $_SESSION, $_SERVER, $_REQUEST);
$content = ob_get_clean();
logMsg("test3.php");
logMsg($content);
var_dump($_SESSION)
的期望输出应该是这样的:
array(0) {
}
array(2) {
["test"] => array(1) {
["test"] => string(6) "lalala"
},
["count"] => int(1)
}
array(2) {
["test"] => array(1) {
["test"] => string(6) "lalala"
},
["count"] => int(2)
}
然而,对于存在问题的用户,输出如下:
array(0) {
}
array(0) {
}
array(1) {
["count"] => int(1)
}
这意味着会话变量不会为这些用户存储。但是,有问题的用户的会话ID在所有3个测试页面中都是相同的。
有人知道这是什么原因吗?据我所知,出问题的代码已经运行了几年,问题是最近一个月左右才开始显现的。
编辑
回答评论中的问题:
- 我无法在本地机器上复制该问题。
- 我收到来自使用IE7和IE9的用户报告的问题。但我不能确定其他版本没有问题,因为可能只是尚未报告。
- 有问题的用户的浏览器未禁用cookie,PHPSESSID cookie已发送到服务器。
- 机器名称中没有-或_(https://dev59.com/J3VC5IYBdhLWcg3wZwTj#306601)。
- 使用session_regenerate_id()重新生成会话ID对于有问题的用户没有影响。
- 具有问题的用户的时区和时间设置与服务器上的相同。
编辑2
正如@nl-x在评论中所述,数据将在第二个请求中存储。所以我修改了测试方案,并添加了另一个步骤以查看会话是否在随后的请求中起作用。结果是,step2.php
和step3.php
中设置的会话数据在请求之间保存。
那么现在的问题是为什么第一个请求的会话数据会丢失,而随后的请求不会?