Функция PHP long2ip(): всё, что нужно знать
Функция long2ip() в PHP преобразует 32-битное целое число, представляющее IPv4-адрес, в привычный формат с точечной нотацией.
IPv4-адрес вида 127.0.0.1 — это, по сути, просто 32-битное число. Базы данных и бинарные протоколы нередко хранят адреса в таком компактном целочисленном виде, поскольку сравнение и индексирование целого числа быстрее и занимает меньше места, чем работа со строкой. При чтении такого значения его нужно преобразовать обратно в привычную запись с точками, понятную человеку. Встроенная функция PHP long2ip() делает именно это.
В этой главе рассказывается, что делает функция, как целые числа соответствуют IPv4-адресам, о подводном камне со знаковыми/беззнаковыми числами, с которым вы рано или поздно столкнётесь, и где функция действительно полезна.
Что такое функция long2ip()?
long2ip() преобразует 32-битное целое число, кодирующее IPv4-адрес, в читаемую человеком строку в формате четырёх чисел, разделённых точками (например, 192.168.0.1).
Такая запись — это четыре 8-битных числа (каждое от 0 до 255), разделённых точками. Поскольку каждый октет занимает один байт, весь адрес помещается в 4 байта = 32 бита. long2ip() просто разбивает это целое число обратно на четыре байта:
3232235521 -> 11000000.10101000.00000000.00000001 -> 192.168.0.1
192 168 0 1Синтаксис
long2ip(int $ip): string$ip— 32-битное целое число, представляющее IPv4-адрес. Должно быть типаint; передача строки вызываетTypeErrorв PHP 8+.- Возвращаемое значение — адрес в виде строки с точечной нотацией (
string).
Базовый пример
Целое число 2130706433 декодируется в адрес петли 127.0.0.1, который echo выводит на экран.
Дополнительные примеры
Несколько распространённых значений делают соответствие нагляднее:
<?php
echo long2ip(0), "\n"; // 0.0.0.0 (lowest possible)
echo long2ip(3232235521), "\n"; // 192.168.0.1 (private LAN)
echo long2ip(4294967295), "\n"; // 255.255.255.255 (highest possible)0 — наименьшее 32-битное значение, соответствующее 0.0.0.0; 4294967295 (то есть 2^32 - 1) — наибольшее, соответствующее широковещательному адресу 255.255.255.255.
Обратное преобразование с ip2long()
long2ip() является обратной функцией по отношению к ip2long(), которая преобразует строку с точечной нотацией в целое число. Эти две функции отменяют действие друг друга:
<?php
$ip = "8.8.8.8";
$long = ip2long($ip); // 134744072
echo long2ip($long); // 8.8.8.8 — back where we startedТакая связка — типичный рабочий паттерн: хранить ip2long($address) в виде целочисленного столбца в базе данных, а затем вызывать long2ip() для отображения или записи в журнал.
Подводный камень со знаковыми целыми числами
На 32-битных платформах ip2long() может возвращать отрицательное число для адресов выше 127.x.x.x, поскольку старший бит интерпретируется как знак. Отрицательные значения также могут встретиться, если целое число было сохранено в знаковом столбце базы данных. long2ip() принимает такие знаковые значения и всё равно декодирует их правильно:
<?php
echo long2ip(-1); // 255.255.255.255Таким образом, «исправлять» отрицательное целое число перед передачей в long2ip() не нужно — но следует понимать, откуда оно взялось, и отдавать предпочтение 64-битным платформам (которые являются стандартом сегодня), где беззнаковое значение сохраняется корректно.
Когда это использовать?
- Эффективное хранение адресов — столбец
INT UNSIGNED(илиBIGINT) занимает меньше места и быстрее индексируется, чемVARCHAR(15), а фильтрация по диапазону IP (WHERE ip BETWEEN ? AND ?) сводится к простой целочисленной арифметике. - Чтение бинарных данных — протоколы и заголовки пакетов хранят адреса как 32-битные целые числа;
long2ip()делает их читаемыми. - Журналирование и аналитика — преобразуйте сохранённые целые числа обратно в строки только в момент отображения.
Для IPv6 функция long2ip() не применима — IPv6-адреса занимают 128 бит. Вместо неё используйте inet_ntop() / inet_pton(), которые поддерживают как IPv4, так и IPv6. Обзор функций для работы с сетью приведён в главе сетевые функции PHP.
Заключение
long2ip() преобразует 32-битное целое число обратно в читаемый IPv4-адрес — это естественная пара для ip2long(). Используйте обе функции вместе, чтобы компактно хранить адреса в виде целых чисел и при этом отображать их в привычном формате с точечной нотацией; помните также, что функция прозрачно обрабатывает знаковые целые числа, которые иногда возникают на 32-битных системах.