Назад | Перейти на главную страницу

x86 / 32-битный PHP на 64-битной Windows Server 2008

Возможно, это неподходящее место для этого вопроса, в противном случае укажите мне правильный сайт SE.

Документация PHP для функции ip2long состояния:

Заметка

Поскольку целочисленный тип PHP подписан, многие IP-адреса приводят к отрицательным целым числам на 32-битных архитектурах.

Что нормально, но меня немного смущает, имеет ли значение версия PHP?

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

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

Вы правы, потому что вы используете 32-битную сборку PHP. Поскольку он скомпилирован как 32-битное приложение, несмотря на то, что он работает в 64-битной системе, вы по-прежнему не получаете 64-битные целые числа.

Также следует отметить, что на момент написания 64-битных сборок PHP в Windows не было 64-битных целых чисел (или поддержки больших файлов), поэтому даже если вы выберете 64-битную версию, вы все равно столкнетесь с целочисленным переполнением.

Вы можете попробовать использовать sprintf с %u формат, чтобы попытаться получить строковое представление 64-битного числа. Я использовал этот код со старыми приложениями PHP4, работающими на 32-битных системах, где я хотел распечатать 64-битные целые числа. Обратите внимание, что это может не подходить, если вам нужно сделать что-либо, кроме вывода 64-битного числа.

$string = sprintf('%u', $someBigInteger);