2013-05-01 21 views
2

在我的测试服务器上修复了我的PHP应用程序后,我将它推送到我的生产服务器,修复程序无法工作。在跟踪它之后,我发现ksort()只会导致索引键溢出整数大于最大32位有符号值(2147483648)在我的生产服务器上。在我的测试服务器上,它只会溢出大于最大有符号64位整数(9223372036854775808)的整数。使用kso​​rt发生不可预知的整数溢出

两个服务器(如全我可以告诉)具有相同的软件配置

  • 的Ubuntu 12.10
  • 内核版本的Linux版本3.0.0-15 - 仿制PAE
  • PHP 5.4 .6-1ubuntu1.2

    1. CPU生产:AMD的Phenom(商标)II X4 910
    2. 测试服务器上的CPU:AMD速龙(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版本不同(尽管两者看起来都是相同的)?

+0

那么你的问题是什么? – 2013-05-01 19:30:14

+0

“uname -m”在每台机器上显示的是什么?您的生产服务器是否运行32位内核而运行64位内核的测试服务器? – rtev 2013-05-01 19:33:21

+0

对不起,我在最后添加了我的实际问题。 “uname -m”的输出在两台服务器上都是x86_64。 – 2013-05-01 19:37:19

回答

0

看一看PHP_INT_SIZE

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

整数大小可以用恒定PHP_INT_SIZE来确定,并且使用恒定PHP_INT_MAX最大值自PHP 4.4.0和5.0.5 PHP。

我也建议增加php memory_limit在php.ini或ini_set()

+0

我在生产服务器上获得8的值,在我的活动服务器上获得4。我认为这是由服务器的架构决定的,为什么两个相同的64位操作系统有两个不同的整数大小? – 2013-05-01 19:42:51

+0

我认为在PHP中设置的问题。 http://php.net/manual/en/reserved.constants.php尝试增加'PHP_INT_MAX' – rinchik 2013-05-01 19:45:40

+0

我会尝试在两台服务器上重新安装PHP,以查看是否可以解决问题。据我所知,无法通过配置文件修改预定义常量PHP_INT_MAX。 – 2013-05-01 20:01:18