Непредсказуемое целочисленное переполнение с помощью ksort

После исправления моего PHP-приложения на тестовом сервере я отправил его на рабочий сервер, и исправление не сработало. После отслеживания я обнаружил, что ksort() вызывает переполнение ключей индекса для целых чисел, превышающих максимальное 32-битное значение со знаком (2147483648) только на моем рабочем сервере. На моем тестовом сервере он будет переполняться только для целых чисел, превышающих максимальное 64-битное целое число со знаком (9223372036854775808).

Оба сервера (насколько я могу судить) имеют одинаковую конфигурацию программного обеспечения.

  • Убунту 12.10
  • Версия ядра: версия Linux 3.0.0-15-generic-pae
  • PHP 5.4.6-1убунту1.2

    1. CPU on production: AMD Phenom(tm) II X4 910
    2. ЦП на тестовом сервере: 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
)

Я пытаюсь выяснить, что может быть причиной этого. Где я должен искать, чтобы сузить, почему серверы имеют разные целочисленные размеры. Возможно ли, что у меня может быть другая версия PHP (даже если обе кажутся одинаковыми), которая была скомпилирована с 32-битными целыми числами?


person Evan Jacobs    schedule 01.05.2013    source источник
comment
Так в чем твой вопрос?   -  person Mike Brant    schedule 01.05.2013
comment
Что показывает uname -m на каждой машине? Ваш рабочий сервер работает с 32-битным ядром по сравнению с вашим тестовым сервером с 64-битным ядром?   -  person rtev    schedule 01.05.2013
comment
Извините, я добавил свой фактический вопрос в конце. Вывод команды uname -m — x86_64 на обоих серверах.   -  person Evan Jacobs    schedule 01.05.2013


Ответы (1)


взгляните на PHP_INT_SIZE

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

Целочисленный размер можно определить с помощью константы PHP_INT_SIZE, а максимальное значение — с помощью константы PHP_INT_MAX, начиная с PHP 4.4.0 и PHP 5.0.5.

Я бы также предложил увеличить PHP memory_limit в php.ini или с помощью ini_set().

person rinchik    schedule 01.05.2013
comment
Я получаю значение 8 на моем рабочем сервере и 4 на моем рабочем сервере. Я думал, что это определяется архитектурой сервера, почему две одинаковые 64-битные операционные системы имеют два разных целочисленных размера? - person Evan Jacobs; 01.05.2013
comment
Я думаю, что проблема в настройке PHP. php.net/manual/en/reserved.constants.php попытаться увеличить PHP_INT_MAX - person rinchik; 01.05.2013
comment
Я попробую переустановить PHP на обоих серверах, чтобы посмотреть, решит ли это проблему. Насколько я могу судить, невозможно изменить предопределенную константу PHP_INT_MAX через файлы конфигурации. - person Evan Jacobs; 02.05.2013