phpのSESSION変数が勝手に書き換わる
phpのSESSION変数が、勝手に書き換わります。
不思議なことにブラウザを立ち上げた(新たにセッションをスタートした)直後には起こりません。
何度か操作してSESSION変数の書き換えを繰り替えした後にこの現象が起こり始めます。
しかも、全く同じプログラムを動かすマシンによって起こったり起こらなかったりします。
マシンAではこの現象は起こらず、マシンBでは起こります。
(両者CentOSですが、バージョンが異なります)
もちろん両者ともサーバとして利用した場合のことです。
書き換わるのみならず、unsetで消去したSESSION変数が、勝手に復活します。
まるで古い値がどこかにキャッシュされていて、リロードする度に
その古い値が読み出されているような感覚です。
当該SESSION変数を書き換える行をすべて検索しチェックしましたが
ソフトウェア的に書き換えている箇所はありません。
しかも、前記のように同じソースを走らせるマシンによって起こったり
起こらなかったりしますし、この現象が起こるマシン(マシンB)でも
セッションをスタートさせた直後は発生しません。
もう少し具体的に書きたいのですが、ソースコードが数万行あり、
どの情報をお伝えすれば適切なのかすら分かりません。
とりとめのない情報で申し訳ありませんが、
心当たりのある方、いらっしゃいませんか?
php5.4系の特性なのでしょうか?
あるいはphp.iniの設定の問題でしょうか?
マシンA(現象発生なし)
$ cat /etc/redhat-release
CentOS release 6.6 (Final)
$ rpm -qa | grep php
php-5.3.3-40.el6_6.i686
マシンB(現象発生)
$ cat /etc/redhat-release
CentOS Linux release 7.3.1611 (Core)
$ rpm -qa | grep php
php-5.4.45-13.el7.remi.x86_64
ちなみにマシンBのphpの誤作動を疑い、バージョンアップしました。
(5.4.** から5.4.45にアップした)
バージョンアップ前後で現象に変化はありません。
情報追加(09/25/2017)
小さなコードで再現できました
<?php
session_start(); // セッションを開始
echo "sessionID:".session_id( )."<br>\n";
echo "a:".$_SESSION["a"]."<br>\n";
echo "b:".$_SESSION["b"]."<br>\n";
$_SESSION["a"]=1;
if(!isset($_SESSION["b"])) {
$_SESSION["b"]=0;
}
echo "a:".$_SESSION["a"]."<br>\n";
echo "b:".$_SESSION["b"]."<br>\n";
// コード(A) ここから
for($i=0;$i<1000;$i++) {
for($j=0;$j<100;$j++) {
for($k=0;$k<10;$k++) {
$_SESSION["a_sample"][$i][$j][$k]=$i+$j+$k+ $_SESSION["b"];
}
}
}
// コード(A) ここまで
unset($_SESSION["a"]);
$_SESSION["b"]++;
echo "a:".$_SESSION["a"]."<br>\n";
echo "b:".$_SESSION["b"]."<br>\n";
?>
実行結果
コード(A)をコメントアウトして実行
初回起動時
sessionID:kb0ld3h1t3vr11ibgfrcrghjf7
a:
b:
a:1
b:0
a:
b:1
2回め
sessionID:kb0ld3h1t3vr11ibgfrcrghjf7
a:
b:1
a:1
b:1
a:
b:2
3回め
sessionID:kb0ld3h1t3vr11ibgfrcrghjf7
a:
b:2
a:1
b:2
a:
b:3
4回め
sessionID:kb0ld3h1t3vr11ibgfrcrghjf7
a:
b:3
a:1
b:3
a:
b:4
ここで、コード(A)を有効にする
5回め
sessionID:kb0ld3h1t3vr11ibgfrcrghjf7
a:
b:4
a:1
b:4
a:
b:5
6回め
sessionID:kb0ld3h1t3vr11ibgfrcrghjf7
a:
b:4
a:1
b:4
a:
b:5
以後、何回繰り返してもこの通り。
こんな感じです。