Ip2long: примеры (PHP)

Преобразование IP адресов с помощью функции ip2long
Раздел: Сетевые функции
ip2long(string $ip): int|false

Функция ip2long в PHP

Функция ip2long выполняет преобразование строки, содержащей IPv4-адрес в формате с точками, в целочисленное представление. Это представление используется для эффективного сравнения адресов, вычисления диапазонов или хранения в базе данных в компактном виде.

Аргументы функции

Функция принимает один обязательный аргумент:

  • ip (string) - IPv4-адрес в строковом формате, например '192.168.1.1'.

Начиная с PHP 5.5, функция также принимает необязательный второй параметр:

  • flags (int) - Битовая маска, которая может включать константу FILTER_FLAG_IPV4 для проверки корректности адреса. Однако в настоящее время этот параметр игнорируется.

Примеры использования функции ip2long

Базовое преобразование
<?php
$ip = '192.168.1.1';
$long = ip2long($ip);
echo $long;
?>
3232235777
Обработка неверного адреса
<?php
$invalid_ip = '256.300.1.1';
$result = ip2long($invalid_ip);
var_dump($result);
?>
bool(false)
Работа с отрицательными числами на 32-битных системах
<?php
$ip = '128.0.0.1';
$long = ip2long($ip);
echo sprintf('%u', $long); // Беззнаковое представление
?>
2147483649

Похожие функции в PHP

  • long2ip - Обратное преобразование целого числа в строку IP-адреса. Используется для восстановления читаемого формата.
  • inet_pton - Преобразует IP-адрес в пакетный формат, поддерживает как IPv4, так и IPv6. Более универсальна, но результат - бинарная строка.
  • inet_ntop - Обратное преобразование для inet_pton.
  • filter_var с флагом FILTER_VALIDATE_IP - Проверяет корректность IP-адреса, может использоваться перед вызовом ip2long.

Функция ip2long предпочтительнее для простого преобразования IPv4 в целое число для сравнения или хранения. Для валидации адресов или работы с IPv6 стоит использовать filter_var или inet_pton.

Типичные ошибки

Игнорирование возврата false
<?php
$ip = 'не ip';
$long = ip2long($ip);
if ($long === false) {
    echo 'Некорректный IP';
} else {
    echo $long;
}
?>
Некорректный IP
Сравнение чисел без учета 32-битного представления
<?php
$ip1 = ip2long('10.0.0.1');
$ip2 = ip2long('192.168.1.1');
// На 32-битной системе $ip1 может быть отрицательным
// Сравнение через sprintf('%u', $ip1)
?>

Для сравнения лучше использовать строковые представления или беззнаковое форматирование.

Изменения в последних версиях PHP

В PHP 8.1.0 параметр flags функции ip2long был объявлен устаревшим, так как он игнорировался с момента введения в PHP 5.5.0. Использование этого параметра теперь вызывает предупреждение об устаревании.

<?php
// Начиная с PHP 8.1.0
$long = ip2long('192.168.1.1', FILTER_FLAG_IPV4);
?>

Код вызовет предупреждение: Deprecated: ip2long(): Passing flags to ip2long() is deprecated.

Расширенные примеры использования

Проверка вхождения IP в диапазон
Пример php
<?php
function ipInRange($ip, $start, $end) {
    $ip_long = sprintf('%u', ip2long($ip));
    $start_long = sprintf('%u', ip2long($start));
    $end_long = sprintf('%u', ip2long($end));
    return $ip_long >= $start_long && $ip_long <= $end_long;
}

$result = ipInRange('192.168.1.5', '192.168.1.1', '192.168.1.10');
var_dump($result);
?>
bool(true)
Генерация маски подсети
Пример php
<?php
function netmaskToLong($bits) {
    return -1 << (32 - $bits);
}
$mask = netmaskToLong(24);
echo sprintf('%u', $mask);
?>
4294967040
Преобразование для хранения в базе данных
Пример php
<?php
$ip = '10.20.30.40';
$long = ip2long($ip);
// Для 32-битных систем используем беззнаковое представление
$db_value = ($long === false) ? null : sprintf('%u', $long);
echo $db_value;
?>
169090600
Создание карты IP для быстрого поиска
Пример php
<?php
$ip_list = ['192.168.1.1', '10.0.0.1', '172.16.0.1'];
$ip_map = [];
foreach ($ip_list as $ip) {
    $long = ip2long($ip);
    if ($long !== false) {
        $ip_map[sprintf('%u', $long)] = $ip;
    }
}
print_r($ip_map);
?>
Array
(
    [3232235777] => 192.168.1.1
    [167772161] => 10.0.0.1
    [2886729729] => 172.16.0.1
)

Аналоги функции в других языках

Python
import ipaddress
ip_int = int(ipaddress.IPv4Address('192.168.1.1'))
print(ip_int)
3232235777
JavaScript
function ip2long(ip) {
    return ip.split('.')
        .reduce((int, octet) => (int << 8) + parseInt(octet, 10), 0) >>> 0;
}
console.log(ip2long('192.168.1.1'));
3232235777
MySQL
SELECT INET_ATON('192.168.1.1');
3232235777

Отличия: в Python используется модуль ipaddress, который предоставляет объектно-ориентированный подход. В JavaScript нет встроенной функции, требуется ручная реализация. В MySQL функция INET_ATON аналогична ip2long, а INET_NTOA - long2ip.

PHP ip2long function comments

En
Ip2long Converts a string containing an (IPv4) Internet Protocol dotted address into a long integer