W3docs

Функция 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).

Базовый пример

php— editable, runs on the server

Целое число 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-битных системах.

Практика

Практика
Что делает функция PHP long2ip()?
Что делает функция PHP long2ip()?
Was this page helpful?