【发布时间】:2013-05-29 08:18:22
【问题描述】:
我有一个网站的问题,其中 PHP 没有为使用 Internet Explorer 的特定用户保存会话变量。但是对于其他一些使用 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 个测试页面都是相同的。
有人知道这可能是什么吗?据我所知,有问题的代码已经运行了好几年,问题在上个月左右开始出现。
编辑
cmets中问题的答案:
- 我无法在本地计算机上复制该问题。
- 我收到了来自 IE7 和 IE9 用户的问题报告。但我不能肯定地说其他版本没有问题,因为可能根本没有报告这些问题。
- 有问题的用户的浏览器没有禁用 cookie,PHPSESSID cookie 被发送到服务器。
- 机器名称中没有 - 或 _ (https://stackoverflow.com/a/306601/534109)。
- 使用 session_regenerate_id() 重新生成会话 ID 对有问题的用户的结果没有影响。
- 有问题的用户的时区和时间设置与服务器上的设置相同。
编辑 2
正如@nl-x 在评论中所述,数据存储在第二个请求中。因此,我调整了测试场景并添加了另一个步骤,以查看会话在后续请求中是否有效。情况就是这样。 step2.php 和 step3.php 中的会话数据集在请求之间保存。
那么现在的问题是为什么第一个请求的会话数据会丢失,而后续请求的会话数据不会丢失?
【问题讨论】:
-
@GungFoo 怎么样? IE9+ 有很好的标准支持。
-
@HamZaDzCyberDeV 大约 30% 的世界,似乎:sitepoint.com/browser-trends-march-2013
-
特定用户是否禁用了cookies?
-
@nl-x 防止会话劫持?
-
这似乎是人们抱怨会话无法正常工作的计算机上的缓存问题。可悲的是,修复它超出了您的控制范围,如果您无法复制问题,您能做的最好的事情就是检查他们的 IE 配置以及他们是否在代理后面。如果没有这些信息,您将无法创建修复程序,因为 PHP 端一切正常。
标签: php internet-explorer session