Internet Explorer を使用している特定のユーザーのセッション変数を PHP が保存しない Web サイトに問題があります。しかし、Internet Explorer を使用している他の一部のユーザーにはまったく問題はなく、他のブラウザーを使用しているユーザーにも問題はありません。
Web サイトに他のコードが含まれていないことを確認するために、次の 3 つの小さなスクリプトを作成しました。
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://stackoverflow.com/a/306601/534109 )。
- session_regenerate_id() でセッション ID を再生成しても、問題のあるユーザーの結果には影響しません。
- 問題のあるユーザーのタイムゾーンと時間の設定は、サーバーと同じです。
編集 2
@nl-x がコメントで述べたように、データは 2 番目のリクエストに保存されます。そこで、テスト シナリオを調整し、別のステップを追加して、後続のリクエストでセッションが機能するかどうかを確認しました。そして、これが事実です。セッション データ セットはstep2.php
、step3.php
リクエスト間で保存されます。
では、最初のリクエストのセッション データが失われ、その後のリクエストでは失われないのはなぜでしょうか。