質問: 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)** 小さなコードで再現できました ``` \n"; echo "a:".$_SESSION["a"]."\n"; echo "b:".$_SESSION["b"]."\n"; $_SESSION["a"]=1; if(!isset($_SESSION["b"])) { $_SESSION["b"]=0; } echo "a:".$_SESSION["a"]."\n"; echo "b:".$_SESSION["b"]."\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"]."\n"; echo "b:".$_SESSION["b"]."\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 以後、何回繰り返してもこの通り。 こんな感じです。
回答: 手元で試したらこんなエラーが出ていました。 PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 6078653 bytes) in Unknown on line 0 これ自体はどっかのパラメータでメモリを増やせば解決するかもしれません。しかし、問題の本質はそれではありません。 セッションデータは(デフォルトではファイルに)シリアライズしてテキストとして保存されるので、サンプルコードのように複雑だったり巨大なデータを保存すると、なんらかの不具合が生じても不思議ではありません。保存できない、パフォーマンスに影響が出る、データが壊れる、など。データ漏洩のリスクにもなります。 もともとの問題についても、現象から言ってセッションデータの保存がうまく行っていないと想像できます。セッションの使い方について設計を見直された方がいいと思います。