W3docs

Funzione PHP long2ip(): tutto quello che devi sapere

La funzione PHP long2ip() converte un intero a 32 bit che rappresenta un indirizzo IPv4 nella notazione decimale puntata leggibile dagli esseri umani.

Un indirizzo IPv4 come 127.0.0.1 è, sotto il cofano, semplicemente un numero a 32 bit. I database e i protocolli binari spesso memorizzano gli indirizzi in quella forma intera compatta perché confrontare e indicizzare un intero è più veloce e occupa meno spazio rispetto al confronto di una stringa. Quando si rilegge tale valore, occorre convertirlo nella familiare notazione decimale puntata che gli esseri umani riconoscono. La funzione built-in long2ip() di PHP esegue esattamente questa conversione.

Questo capitolo spiega cosa fa la funzione, come gli interi si mappano agli indirizzi IPv4, il problema degli interi con segno che prima o poi si incontrerà, e dove la funzione è realmente utile.

Cos'è la funzione long2ip()?

long2ip() converte un intero a 32 bit che codifica un indirizzo IPv4 nella sua rappresentazione decimale puntata leggibile dagli esseri umani (ad esempio 192.168.0.1).

Una decimale puntata è composta da quattro numeri a 8 bit (ciascuno da 0 a 255) separati da punti. Poiché ogni ottetto corrisponde a un byte, l'intero indirizzo entra in 4 byte = 32 bit. long2ip() divide semplicemente quell'intero in quattro byte:

3232235521  ->  11000000.10101000.00000000.00000001  ->  192.168.0.1
                 192        168       0          1

Sintassi

long2ip(int $ip): string
  • $ip — l'intero a 32 bit che rappresenta l'indirizzo IPv4. Deve essere un int; passare una stringa genera un TypeError in PHP 8+.
  • Valore restituito — l'indirizzo come string in formato decimale puntato.

Esempio di base

php— editable, runs on the server

L'intero 2130706433 viene decodificato nell'indirizzo di loopback 127.0.0.1, che echo stampa a schermo.

Altri esempi

Alcuni valori comuni rendono più chiara la mappatura:

<?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 è il valore più piccolo a 32 bit e si mappa su 0.0.0.0; 4294967295 (che è 2^32 - 1) è il più grande e si mappa sul broadcast 255.255.255.255.

Round-trip con ip2long()

long2ip() è l'inverso di ip2long(), che converte una stringa in formato decimale puntato nella sua forma intera. Le due funzioni si annullano a vicenda:

<?php

$ip   = "8.8.8.8";
$long = ip2long($ip);        // 134744072
echo long2ip($long);         // 8.8.8.8 — back where we started

Questa coppia rappresenta il flusso di lavoro tipico: memorizzare ip2long($address) come colonna intera nel database, poi chiamare long2ip() quando occorre visualizzarlo o registrarlo nei log.

Il problema degli interi con segno

Su una piattaforma a 32 bit, ip2long() può restituire un numero negativo per gli indirizzi superiori a 127.x.x.x, poiché il bit più significativo viene interpretato come segno. È possibile vedere valori negativi anche se un intero è stato memorizzato in una colonna di database con segno. long2ip() accetta questi valori con segno e li decodifica comunque correttamente:

<?php

echo long2ip(-1); // 255.255.255.255

Quindi non è necessario "correggere" un intero negativo prima di passarlo a long2ip() — ma è importante essere consapevoli dell'origine del valore negativo, e preferire le piattaforme a 64 bit (predefinite oggi) dove il valore senza segno viene preservato.

Quando si usa?

  • Memorizzare gli indirizzi in modo efficiente — una colonna INT UNSIGNED (o BIGINT) è più piccola e più veloce da indicizzare rispetto a un VARCHAR(15), e il filtraggio per intervallo IP (WHERE ip BETWEEN ? AND ?) diventa semplice aritmetica tra interi.
  • Lettura di dati binari — i protocolli e le intestazioni dei pacchetti trasportano gli indirizzi come interi grezzi a 32 bit; long2ip() li rende leggibili.
  • Log e analisi — convertire gli interi memorizzati in stringhe solo al momento della visualizzazione.

Per IPv6, long2ip() non è applicabile — gli indirizzi IPv6 sono a 128 bit. Usare invece inet_ntop() / inet_pton(), che gestiscono sia IPv4 che IPv6. Consultare il capitolo sulle funzioni di rete PHP per una panoramica.

Conclusione

long2ip() converte un intero a 32 bit in un indirizzo IPv4 leggibile, il naturale complemento di ip2long(). Usare entrambe per memorizzare gli indirizzi in modo compatto come interi pur visualizzandoli come familiari stringhe in formato decimale puntato, e ricordare che la funzione gestisce in modo trasparente gli interi con segno che i sistemi a 32 bit talvolta producono.

Esercitazione

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