38187


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)**  
小さなコードで再現できました

[code]

    <?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";
    
    ?>
    
[/code]

実行結果  
コード(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

３回め  
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

以後、何回繰り返してもこの通り。  
こんな感じです。


CC BY-SA 3.0
2017-09-22T13:24:49.320
38122
2017-09-26T01:28:02.470
2017-09-25T14:03:44.337
question
php linux centos
phpのSESSION変数が勝手に書き換わる


手元で試したらこんなエラーが出ていました。

PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to
allocate 6078653 bytes) in Unknown on line 0

これ自体はどっかのパラメータでメモリを増やせば解決するかもしれません。しかし、問題の本質はそれではありません。

セッションデータは(デフォルトではファイルに)シリアライズしてテキストとして保存されるので、サンプルコードのように複雑だったり巨大なデータを保存すると、なんらかの不具合が生じても不思議ではありません。保存できない、パフォーマンスに影響が出る、データが壊れる、など。データ漏洩のリスクにもなります。

もともとの問題についても、現象から言ってセッションデータの保存がうまく行っていないと想像できます。セッションの使い方について設計を見直された方がいいと思います。


CC BY-SA 3.0
2017-09-26T01:28:02.470
38187
2017-09-26T01:28:02.470
5793
38122
answer