Ip2long: примеры (PHP)
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)
<?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.
Типичные ошибки
<?php
$ip = 'не ip';
$long = ip2long($ip);
if ($long === false) {
echo 'Некорректный IP';
} else {
echo $long;
}
?>Некорректный IP
<?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.
Расширенные примеры использования
<?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
function netmaskToLong($bits) {
return -1 << (32 - $bits);
}
$mask = netmaskToLong(24);
echo sprintf('%u', $mask);
?>4294967040
<?php
$ip = '10.20.30.40';
$long = ip2long($ip);
// Для 32-битных систем используем беззнаковое представление
$db_value = ($long === false) ? null : sprintf('%u', $long);
echo $db_value;
?>169090600
<?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
)Аналоги функции в других языках
import ipaddress
ip_int = int(ipaddress.IPv4Address('192.168.1.1'))
print(ip_int)3232235777
function ip2long(ip) {
return ip.split('.')
.reduce((int, octet) => (int << 8) + parseInt(octet, 10), 0) >>> 0;
}
console.log(ip2long('192.168.1.1'));3232235777
SELECT INET_ATON('192.168.1.1');3232235777
Отличия: в Python используется модуль ipaddress, который предоставляет объектно-ориентированный подход. В JavaScript нет встроенной функции, требуется ручная реализация. В MySQL функция INET_ATON аналогична ip2long, а INET_NTOA - long2ip.