Возможно, это неподходящее место для этого вопроса, в противном случае укажите мне правильный сайт 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);