我有一个网站的问题,其中 PHP 不使用 Internet Explorer 为特定用户保存会话变量。但是对于其他一些使用 Internet Explorer 的用户来说完全没有问题,使用其他浏览器的用户也没有任何问题。
我创建了以下三个小脚本,以确保网站中不涉及其他代码:
测试.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>
测试2.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>
测试3.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)
}
这意味着不会为这些用户存储会话变量。但是,对于所有 3 个测试页面,有问题的用户的会话 ID 是相同的。
有人知道这可能是什么吗?据我所知,有问题的代码已经运行了好几年,问题在上个月左右开始出现。
编辑
对评论中问题的回答:
- 我无法在本地机器上复制问题。
- 我收到了来自 IE7 和 IE9 用户的问题报告。但我不能肯定地说其他版本没有问题,因为可能根本没有报告这些问题。
- 有问题的用户的浏览器没有禁用 cookie,PHPSESSID cookie 被发送到服务器。
- 机器名称中没有 - 或 _ ( https://stackoverflow.com/a/306601/534109 )。
- 使用 session_regenerate_id() 重新生成会话 ID 对有问题的用户的结果没有影响。
- 有问题的用户的时区和时间设置与服务器上的相同。
编辑 2
正如@nl-x 在评论中所述,数据存储在第二个请求中。因此,我调整了测试场景并添加了另一个步骤,以查看会话在后续请求中是否有效。情况就是这样。会话数据在请求之间设置step2.php
并step3.php
保存。
所以现在的问题是为什么第一个请求的会话数据会丢失而不是后续请求?