Fonction PHP inet_pton() : Tout ce que vous devez savoir
En tant que développeur PHP, vous pouvez avoir besoin de convertir une adresse IP d'un format lisible en chaîne binaire. La fonction inet_pton() est une fonction intégrée en
La fonction PHP inet_pton() convertit une adresse IP lisible par l'homme — comme 127.0.0.1 ou 2001:db8::1 — en sa représentation binaire compacte. Le nom signifie "presentation to network" : elle prend la forme de présentation (le texte en notation pointée ou avec deux-points que vous tapez) et renvoie la forme réseau (les octets bruts qui transitent réellement sur le fil).
Cette page couvre la syntaxe, les cas IPv4 et IPv6, comment lire le résultat en toute sécurité, comment le convertir en sens inverse, et les raisons pratiques pour lesquelles on stockerait des adresses IP en binaire.
Qu'est-ce que la fonction inet_pton() ?
inet_pton() analyse une chaîne IPv4 ou IPv6 valide et renvoie une chaîne binaire compacte in-addr — 4 octets pour IPv4, 16 octets pour IPv6. Si l'entrée n'est pas une adresse IP valide, elle renvoie false au lieu de lever une exception.
La « chaîne binaire » qu'elle renvoie n'est pas lisible par l'homme : il s'agit des octets bruts, donc l'afficher directement dans un terminal ou un navigateur produit du contenu illisible. Pour l'inspecter, convertissez-la avec bin2hex(). Pour la retransformer en chaîne IP normale, utilisez sa fonction miroir, inet_ntop().
Syntaxe
inet_pton(string $ip): string|falseLa fonction prend un paramètre :
$ip— l'adresse IP à convertir, sous forme de chaîne (IPv4 ou IPv6).
Valeur de retour : la chaîne binaire compacte en cas de succès, ou false si $ip n'est pas une adresse IP valide.
Exemple de base : IPv4
Les 4 octets bruts de 127.0.0.1 sont 7f 00 00 01 — exactement les octets décimaux de 127.0.0.1 écrits en hexadécimal. Comme la chaîne binaire elle-même n'est pas imprimable, on la passe à bin2hex() pour que les octets s'affichent en hexadécimal lisible.
IPv4 et IPv6
Contrairement à l'ancienne fonction ip2long(), qui ne gère que l'IPv4, inet_pton() fonctionne pour les deux familles d'adresses. IPv4 produit 4 octets ; IPv6 en produit 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"; // 16Vérifier strlen() sur le résultat est le moyen le plus simple de déterminer à quelle famille appartient une adresse : une longueur de 4 indique IPv4, 16 indique IPv6.
Gérer les entrées invalides
Lorsque la chaîne n'est pas une adresse IP valide, inet_pton() renvoie false. Vérifiez toujours le résultat avant de l'utiliser — sinon vous risquez de stocker ou de comparer false (une chaîne vide) par erreur :
<?php
$input = "not-an-ip";
$packed = inet_pton($input);
if ($packed === false) {
echo "Invalid IP address";
} else {
echo bin2hex($packed);
}
// Outputs: Invalid IP addressUtilisez la comparaison stricte (===) ici. Un 0.0.0.0 valide se compacte en l'octet 00000000, dont le premier octet est un octet nul ; une vérification lâche == false pourrait se tromper sur des cas particuliers, donc === false est le test sûr.
Inverser la conversion
inet_pton() et inet_ntop() forment une paire assortie : l'une compacte, l'autre décompacte. Un aller-retour renvoie l'adresse d'origine :
<?php
$packed = inet_pton("2001:db8::1");
echo inet_ntop($packed); // Outputs 2001:db8::1Quand utiliser cette fonction ?
Stocker les adresses IP sous forme binaire compacte concerne principalement un stockage compact, triable et indépendant de la famille :
- Stockage en base de données. Une colonne binaire (
VARBINARY(16)) peut contenir n'importe quelle adresse IPv4 ou IPv6 sous une forme fixe et compacte, et trie correctement. Utilisezinet_pton()avantINSERTetinet_ntop()aprèsSELECT. - Comparaisons de plages. Parce que les octets préservent l'ordre numérique, vous pouvez comparer des chaînes compactes pour vérifier si une adresse appartient à un sous-réseau.
- Recherches par correspondance exacte. Comparer des clés binaires de longueur fixe est plus rapide et évite l'ambiguïté des formes textuelles (par ex.
2001:db8::1et2001:0db8:0000:...:0001désignent la même adresse mais sont des chaînes différentes — la compaction les normalise).
Pour les calculs numériques IPv4 uniquement, ip2long() et long2ip() sont une alternative, mais ils ne peuvent pas représenter IPv6.
Conclusion
inet_pton() convertit une adresse IPv4 ou IPv6 de sa forme textuelle lisible par l'homme en une chaîne binaire compacte — 4 octets pour IPv4, 16 pour IPv6 — et renvoie false en cas d'entrée invalide. Associez-la à inet_ntop() pour inverser la conversion, et utilisez bin2hex() lorsque vous avez besoin d'inspecter les octets bruts. C'est la méthode standard pour stocker et comparer des adresses IP de façon compacte dans une base de données tout en prenant en charge les deux familles d'adresses.