eAcceleratorと配列

PHPのアクセラレータとして有名な一つにeAcceleratorがあります。
ふと、入れ忘れたサーバが多いと思ってyum install php-eacceleratorとしていれました。

すると、不思議なことにそれまで動いていたプログラムの中で1つだけNGなものがありました。
どんな動きかというと、JavascriptでPOSTして、返ってきた値を特定の

に出力するというものです。

ChoromeのJavascript コンソールで見ると、POSTしたところが赤くなり
・Status → failed
・Type → pending
・Size → 0
のように異常な状態でした。いろいろ切り分けていくと、呼んでいるサーバ側のPHPでとある部分をコメントアウトすると現象が出ないことが分かりました。

$insert_array = array (
  'chara_id'   => $_POST['chara_id'] , // @param integer キャラクターのID                                   
  'comment_id' => $_POST['comment'] , // @param integer コメントのID                                        
  'ip_address' => $_SERVER['REMOTE_ADDR'] , // IP
  'browser'    => $_SERVER['HTTP_USER_AGENT'] , // ブラウザ
  'player_id'  => $auth_obj->getAuthData("player_id") , // player_id 
  'access_time'  => date("c",$_SERVER['REQUEST_TIME'])  // 時間はWEBサーバで取得
);

この中で

$_POST[‘chara_id’]
$_POST[‘comment’]
$_SERVER[‘REMOTE_ADDR’]

これらを配列に格納している部分にてコメントアウトすると現象はぴたりとやみました。
では、配列に直接入れるのではなく、一度別の変数に格納してからならばどうだろうか?と思って下記のように変更したらうまくいきました。これらは全て数字でスーパーグローバル変数という点も共通なので、他にもあるかもです。

$chara_id   = $_POST['chara_id'];      // eaccelerator トラブル回避
$comment_id = $_POST['comment'];       // eaccelerator トラブル回避
$ip_address = $_SERVER['REMOTE_ADDR']; // eaccelerator トラブル回避
 
$insert_array = array (
  'chara_id'   => $chara_id , // @param integer キャラクターのID                                   
  'comment_id' => $comment_id , // @param integer コメントのID                                        
  'ip_address' => $ip_address , // IP
  'browser'    => $_SERVER['HTTP_USER_AGENT'] , // ブラウザ
  'player_id'  => $auth_obj->getAuthData("player_id") , // player_id 
  'access_time'  => date("c",$_SERVER['REQUEST_TIME'])  // 時間はWEBサーバで取得
);

また、php.iniの中でoptimizerをOFFにすることによって、現象が止まったりしましたが、これもあまり嬉しい話ではなく。

eaccelerator.optimizer = 0

僕の書き方が悪いのか、eAcceleratorのバグなのか。
そういえば、ZabbixとeAcceleratorで一部WEBのUIが動かないとか値が引き渡されない現象に遭遇しましたが、意外とこういうところなのかもしれないです。