W3docs

Funzione PHP inet_pton(): Tutto ciò che devi sapere

La funzione inet_pton() di PHP converte un indirizzo IP dal formato leggibile in una stringa binaria compressa. Scopri sintassi, esempi e casi d'uso pratici.

La funzione PHP inet_pton() converte un indirizzo IP leggibile dall'uomo — come 127.0.0.1 o 2001:db8::1 — nella sua rappresentazione binaria compressa. Il nome sta per "presentation to network" (presentazione alla rete): prende la forma di presentazione (il testo con punti/due punti che si digita) e restituisce la forma di rete (i byte grezzi che viaggiano effettivamente sul cavo).

Questa pagina tratta la sintassi, sia per IPv4 che per IPv6, come leggere il risultato in modo sicuro, come invertire la conversione e le ragioni pratiche per cui si memorizzano gli IP in formato binario.

Cos'è la funzione inet_pton()?

inet_pton() analizza una stringa IPv4 o IPv6 valida e restituisce una stringa binaria compressa in-addr — 4 byte per IPv4, 16 byte per IPv6. Se l'input non è un indirizzo IP valido, restituisce false anziché generare un'eccezione.

La "stringa binaria" restituita non è leggibile dall'uomo: si tratta di byte grezzi, quindi stamparla direttamente su un terminale o nel browser mostra caratteri illeggibili. Per ispezionarla, convertila con bin2hex(). Per riconvertirla in una normale stringa IP, usa la sua funzione speculare, inet_ntop().

Sintassi

inet_pton(string $ip): string|false

La funzione accetta un parametro:

  • $ip — l'indirizzo IP da convertire, come stringa (IPv4 o IPv6).

Valore restituito: la stringa binaria compressa in caso di successo, oppure false se $ip non è un indirizzo IP valido.

Esempio base: IPv4

php— editable, runs on the server

I 4 byte grezzi di 127.0.0.1 sono 7f 00 00 01 — esattamente gli ottetti decimali di 127.0.0.1 scritti in esadecimale. Poiché la stringa binaria grezza non è stampabile, la passiamo attraverso bin2hex() in modo che i byte vengano visualizzati come esadecimale leggibile.

IPv4 e IPv6

A differenza della più vecchia ip2long(), che gestisce solo IPv4, inet_pton() funziona per entrambe le famiglie di indirizzi. IPv4 produce 4 byte; IPv6 ne produce 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";     // 16

Controllare strlen() sul risultato è il modo più semplice per determinare a quale famiglia appartiene un indirizzo: una lunghezza di 4 indica IPv4, 16 indica IPv6.

Gestione degli input non validi

Quando la stringa non è un IP valido, inet_pton() restituisce false. Controlla sempre il risultato prima di utilizzarlo — altrimenti potresti finire per memorizzare o confrontare false (una stringa vuota) per errore:

<?php

$input = "not-an-ip";
$packed = inet_pton($input);

if ($packed === false) {
    echo "Invalid IP address";
} else {
    echo bin2hex($packed);
}
// Outputs: Invalid IP address

Usa il confronto rigoroso (===) in questo caso. Un 0.0.0.0 valido viene compresso al byte 00000000, il cui primo byte è un byte nullo; un controllo con == false non rigoroso potrebbe dare falsi positivi in casi limite, quindi === false è il test sicuro.

Inversione della conversione

inet_pton() e inet_ntop() formano una coppia abbinata: una comprime, l'altra decomprime. Un ciclo di andata e ritorno restituisce l'indirizzo originale:

<?php

$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs 2001:db8::1

Quando si usa questa funzione?

Memorizzare gli IP come binario compresso riguarda principalmente la memorizzazione compatta, ordinabile e indipendente dalla famiglia:

  • Memorizzazione nel database. Una colonna binaria (VARBINARY(16)) contiene qualsiasi indirizzo IPv4 o IPv6 in forma fissa e compatta e ordina correttamente. Usa inet_pton() prima di INSERT e inet_ntop() dopo SELECT.
  • Confronti di intervalli. Poiché i byte preservano l'ordine numerico, puoi confrontare stringhe compresse per verificare se un indirizzo rientra in una sottorete.
  • Ricerche per corrispondenza esatta. Il confronto di chiavi binarie a lunghezza fissa è più veloce ed evita l'ambiguità delle forme testuali (ad esempio 2001:db8::1 e 2001:0db8:0000:...:0001 sono lo stesso indirizzo ma stringhe diverse — la compressione li normalizza).

Per operazioni numeriche solo su IPv4, ip2long() e long2ip() sono un'alternativa, ma non possono rappresentare IPv6.

Conclusione

inet_pton() converte un indirizzo IPv4 o IPv6 dalla sua forma testuale leggibile in una stringa binaria compressa — 4 byte per IPv4, 16 per IPv6 — e restituisce false per input non validi. Abbinala a inet_ntop() per invertire la conversione, e usa bin2hex() quando hai bisogno di ispezionare i byte grezzi. È il metodo standard per memorizzare e confrontare gli indirizzi IP in modo compatto in un database supportando entrambe le famiglie di indirizzi.

Pratica

Pratica
Cosa fa la funzione inet_pton() in PHP?
Cosa fa la funzione inet_pton() in PHP?
Was this page helpful?