Função PHP inet_pton(): Tudo o que Você Precisa Saber
Como desenvolvedor PHP, você pode precisar converter um endereço IP de um formato legível por humanos para uma string binária. A função inet_pton() é uma função nativa do PHP.
A função PHP inet_pton() converte um endereço IP legível por humanos — como 127.0.0.1 ou 2001:db8::1 — para sua representação binária compactada. O nome significa "presentation to network" (apresentação para rede): ela recebe a forma de apresentação (o texto com pontos/dois-pontos que você digita) e retorna a forma de rede (os bytes brutos que realmente trafegam na rede).
Esta página aborda a sintaxe, tanto IPv4 quanto IPv6, como ler o resultado com segurança, como revertê-lo e as razões práticas para armazenar IPs em formato binário.
O que é a função inet_pton()?
inet_pton() analisa uma string IPv4 ou IPv6 válida e retorna uma string binária compactada in-addr — 4 bytes para IPv4, 16 bytes para IPv6. Se a entrada não for um endereço IP válido, ela retorna false em vez de lançar uma exceção.
A "string binária" retornada não é legível por humanos: são os bytes brutos, então imprimi-la diretamente em um terminal ou navegador exibe caracteres ininteligíveis. Para inspecioná-la, converta-a com bin2hex(). Para transformá-la de volta em uma string IP normal, use sua função espelho, inet_ntop().
Sintaxe
inet_pton(string $ip): string|falseA função recebe um parâmetro:
$ip— o endereço IP a ser convertido, como uma string (IPv4 ou IPv6).
Valor de retorno: a string binária compactada em caso de sucesso, ou false se $ip não for um endereço IP válido.
Exemplo básico: IPv4
Os 4 bytes brutos de 127.0.0.1 são 7f 00 00 01 — exatamente os octetos decimais de 127.0.0.1 escritos em hexadecimal. Como a string binária em si não é imprimível, a passamos por bin2hex() para que os bytes apareçam como hex legível.
IPv4 e IPv6
Ao contrário da função mais antiga ip2long(), que só lida com IPv4, inet_pton() funciona com ambas as famílias de endereços. IPv4 produz 4 bytes; IPv6 produz 16:
<?php
echo bin2hex(inet_pton("192.168.1.1")), "\n"; // c0a80101 (4 bytes)
echo bin2hex(inet_pton("2001:db8::1")), "\n"; // 20010db8000000000000000000000001 (16 bytes)
echo strlen(inet_pton("192.168.1.1")), "\n"; // 4
echo strlen(inet_pton("2001:db8::1")), "\n"; // 16Verificar strlen() no resultado é a forma mais simples de determinar a qual família um endereço pertence: um comprimento de 4 significa IPv4, 16 significa IPv6.
Tratando entradas inválidas
Quando a string não é um IP válido, inet_pton() retorna false. Sempre verifique o resultado antes de usá-lo — caso contrário, você pode acabar armazenando ou comparando false (uma string vazia) por acidente:
<?php
$input = "not-an-ip";
$packed = inet_pton($input);
if ($packed === false) {
echo "Invalid IP address";
} else {
echo bin2hex($packed);
}
// Outputs: Invalid IP addressUse comparação estrita (===) aqui. Um 0.0.0.0 válido é compactado como o byte 00000000, cujo primeiro byte é um byte nulo; uma verificação solta com == false pode disparar incorretamente em casos extremos, então === false é o teste seguro.
Revertendo a conversão
inet_pton() e inet_ntop() formam um par complementar: uma compacta, a outra descompacta. Uma ida e volta retorna o endereço original:
<?php
$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs 2001:db8::1Quando eu usaria isso?
Armazenar IPs como binário compactado é principalmente sobre armazenamento compacto, ordenável e independente de família:
- Armazenamento em banco de dados. Uma coluna binária (
VARBINARY(16)) armazena qualquer endereço IPv4 ou IPv6 em um formato fixo e compacto, e ordena corretamente. Useinet_pton()antes doINSERTeinet_ntop()após oSELECT. - Comparações de intervalos. Como os bytes preservam a ordem numérica, você pode comparar strings compactadas para verificar se um endereço está dentro de uma sub-rede.
- Buscas por correspondência exata. Comparar chaves binárias de comprimento fixo é mais rápido e evita a ambiguidade das formas textuais (por exemplo,
2001:db8::1e2001:0db8:0000:...:0001são o mesmo endereço, mas strings diferentes — a compactação os normaliza).
Para cálculos numéricos somente com IPv4, ip2long() e long2ip() são uma alternativa, mas não conseguem representar IPv6.
Conclusão
inet_pton() converte um endereço IPv4 ou IPv6 de sua forma textual legível por humanos para uma string binária compactada — 4 bytes para IPv4, 16 para IPv6 — e retorna false para entradas inválidas. Use-a em conjunto com inet_ntop() para reverter a conversão, e use bin2hex() quando precisar inspecionar os bytes brutos. É a forma padrão de armazenar e comparar endereços IP de forma compacta em um banco de dados, suportando ambas as famílias de endereços.