使用kso​​rt进行不可预测的整数溢出

时间:2013-05-01 19:27:50

标签: php linux sorting integer-overflow

在我的测试服务器上修复我的PHP应用程序之后,我将它推送到生产服务器并且修复程序无效。在跟踪它之后,我发现ksort()导致索引键溢出,只有大于我生产服务器上的最大32位有符号值(2147483648)的整数。在我的测试服务器上,它只会溢出大于最大有符号64位整数的整数(9223372036854775808)。

两台服务器(尽我所知)具有相同的软件配置

  • Ubuntu 12.10
  • 内核版本:Linux版本3.0.0-15-generic-pae
  • PHP 5.4.6-1ubuntu1.2

    1. CPU on production: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(尽管两者看起来都相同)?

1 个答案:

答案 0 :(得分:0)

看看PHP_INT_SIZE

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

  

整数大小可以使用常量PHP_INT_SIZE来确定,最大值可以使用自PHP 4.4.0和PHP 5.0.5以来的常量PHP_INT_MAX来确定。

我还建议在php.ini或memory_limit中增加PHP ini_set()