テスト サーバーで PHP アプリケーションを修正した後、それを運用サーバーにプッシュしましたが、修正が機能しませんでした。それを追跡した後、ksort() が最大 32 ビット符号付き値 (2147483648) よりも大きい整数のインデックス キーのオーバーフローを、実稼働サーバーでのみ引き起こしていることがわかりました。私のテスト サーバーでは、最大符号付き 64 ビット整数 (9223372036854775808) より大きい整数に対してのみオーバーフローします。
どちらのサーバーも (私が知る限り完全に) 同じソフトウェア構成を持っています
- Ubuntu 12.10
- カーネル バージョン: Linux バージョン 3.0.0-15-generic-pae
PHP 5.4.6-1ubuntu1.2
- 製造時の CPU: AMD Phenom(tm) II X4 910
- テスト サーバーの CPU: AMD Athlon(tm) II X4 620
この問題を再現するには
$arr = array(2147483648 => 1, 5 => 2); ksort($arr); print_r($arr);
本番サーバーで次を出力します。
Array
(
[-2147483648] => 1
[5] => 2
)
私のテストサーバーでは、まったく同じコードが次のように出力されます。
Array
(
[5] => 2
[2147483648] => 1
)
私はこれを引き起こしている可能性があるものを理解しようとしています。サーバーの整数サイズが異なる理由を絞り込むには、どこを見ればよいでしょうか。32 ビット整数でコンパイルされた別のバージョンの PHP (両方とも同じように見えますが) を使用している可能性はありますか?