2

テスト サーバーで PHP アプリケーションを修正した後、それを運用サーバーにプッシュしましたが、修正が機能しませんでした。それを追跡した後、ksort() が最大 32 ビット符号付き値 (2147483648) よりも大きい整数のインデックス キーのオーバーフローを、実稼働サーバーでのみ引き起こしていることがわかりました。私のテスト サーバーでは、最大符号付き 64 ビット整数 (9223372036854775808) より大きい整数に対してのみオーバーフローします。

どちらのサーバーも (私が知る限り完全に) 同じソフトウェア構成を持っています

  • Ubuntu 12.10
  • カーネル バージョン: Linux バージョン 3.0.0-15-generic-pae
  • PHP 5.4.6-1ubuntu1.2

    1. 製造時の CPU: AMD Phenom(tm) II X4 910
    2. テスト サーバーの 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 (両方とも同じように見えますが) を使用している可能性はありますか?

4

1 に答える 1

0

を見てみましょうPHP_INT_SIZE

http://php.net/manual/en/language.types.integer.php

PHP 4.4.0 および PHP 5.0.5 以降、整数サイズは定数 PHP_INT_SIZE を使用して決定でき、最大値は定数 PHP_INT_MAX を使用して決定できます。

memory_limitまた、php.ini または でPHP を増やすことをお勧めしini_set()ます。

于 2013-05-01T19:35:44.187 に答える