У меня проблема с сайтом, на котором 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)
}
Это означает, что переменные сеанса не сохраняются для этих пользователей. Однако идентификатор сеанса для пользователей с проблемами одинаковый для всех трех тестовых страниц.
Кто-нибудь знает, что это может быть? Насколько я знаю, проблемный код работал несколько лет, и проблемы начали проявляться в последний месяц или около того.
Edit
Ответы на вопросы в комментариях:
- Я не могу реплицировать проблему на локальной машине.
- У меня есть сообщения о проблемах пользователей с IE7 и IE9. Но я не могу точно сказать, что проблем с другими версиями нет, потому что может быть, что они просто не сообщаются.
- В браузере пользователя с этой проблемой не отключены файлы cookie, cookie PHPSESSID отправляется на сервер.
- В имени машины нет - или _ (qaru.site/info/360503/...).
- Восстановление идентификатора сеанса с помощью session_regenerate_id() не влияет на результат для пользователей с проблемой.
- Настройки часового пояса и времени для пользователя с такой же проблемой, как на сервере.
Изменить 2
Как указано @nl-x в комментарии, данные сохраняются во втором запросе. Поэтому я адаптировал тестовый сценарий и добавил еще один шаг, чтобы увидеть, работает ли сеанс в последующих запросах. И это так. Данные сеанса, установленные в step2.php
и step3.php
, сохраняются между запросами.
Итак, теперь возникает вопрос, почему данные сеанса для первого запроса теряются, а не для последующих запросов?