Position actuelle: Accueil> Derniers articles> La fonction PHP GethostByName est-elle compatible dans l'environnement IPv6? Quels problèmes et solutions existent?

La fonction PHP GethostByName est-elle compatible dans l'environnement IPv6? Quels problèmes et solutions existent?

gitbox 2025-06-10

Dans PHP, la fonction GethostByName est une méthode courante utilisée pour résoudre les noms d'hôtes en adresses IPv4. Son utilisation typique est très simple:

 <?php
$ip = gethostbyname("example.com");
echo $ip;
?>

Cependant, à mesure que l'environnement réseau migre progressivement vers IPv6, de nombreux développeurs se préoccuperont: GethostByName est-il compatible dans l'environnement IPv6? Est-ce qu'il prend en charge l'analyse des adresses IPv6? Y a-t-il des problèmes potentiels? Comment le résoudre?

Le mécanisme de travail de GethostByName est compatible avec IPv6

La fonction GethostByName est basée sur la conception traditionnelle IPv4. Sa fonction principale est de renvoyer la première chaîne d'adresse IPv4 correspondant au nom d'hôte. Si l'hôte de requête n'a pas d'adresse IPv4 et que seule une adresse IPv6 existe, alors GethostByName peut ne pas renvoyer une IP valide normalement.

Autrement dit:

  • Seule la résolution d'adresse IPv4 est prise en charge.

  • Les adresses IPv6 ne sont pas prises en charge.

  • Si le nom d'hôte n'est analysé qu'à une adresse IPv6, le résultat de retour est généralement le nom d'hôte lui-même (indiquant qu'il n'est pas analysé avec succès).

Exemple de code:

 <?php
$ip = gethostbyname("ipv6only.example.com");
echo $ip; // Sortie possible“ipv6only.example.com”,Plutôt IP adresse
?>

Cela montre que dans un environnement IPv6 pur, GethostByname a une applicabilité limitée.

Problèmes existants

  1. Impossible d'obtenir l'adresse IPv6
    GethostByName renvoie uniquement une adresse IPv4 et ne peut pas traiter les enregistrements AAAA, c'est-à-dire les adresses IPv6.

  2. Compatibilité insuffisante <br> Dans les réseaux modernes, de plus en plus de serveurs n'utilisent que des adresses IPv6, et GethostByName ne peut pas répondre aux besoins.

  3. Erreur potentielle <br> Si le programme s'appuie sur GethostByName pour obtenir une IP valide, elle peut entraîner une erreur ou une exception logique lors de la rencontre d'un hôte IPv6 pur.

Solution

Afin d'être compatible avec IPv6, il est recommandé d'utiliser des fonctions plus modernes, telles que DNS_GET_RECORD ou GetAddrinfo fournies par PHP 7+, et peut également prendre en charge IPv6 avec Stream_Socket_Client .

Méthode 1: Utilisez dns_get_record pour obtenir des enregistrements A et AAAA

 <?php
$hostname = "example.com";

// Faire tout A et AAAA Enregistrer
$records = dns_get_record($hostname, DNS_A + DNS_AAAA);

$ipv4s = [];
$ipv6s = [];

foreach ($records as $record) {
    if ($record['type'] === 'A') {
        $ipv4s[] = $record['ip'];
    } elseif ($record['type'] === 'AAAA') {
        $ipv6s[] = $record['ipv6'];
    }
}

echo "IPv4 addresses:\n";
print_r($ipv4s);

echo "IPv6 addresses:\n";
print_r($ipv6s);
?>

Cette méthode peut obtenir toutes les adresses IPv4 et IPv6 correspondant au nom d'hôte en même temps.

Méthode 2: Utilisez la fonction GetAddrinfo (PHP 7.0+)

PHP 7.0 a introduit plus tard socket_getaddrinfo dans l'extension Sockets , qui peut renvoyer des informations d'adresse plus complètes et prend en charge IPv4 et IPv6.

 <?php
$hostname = "example.com";
$results = socket_getaddrinfo($hostname, null);

foreach ($results as $result) {
    $ip = $result['address'];
    echo "IP: $ip\n";
}
?>

Cette méthode repose sur l'installation des extensions de sockets et prend en charge les adresses IPv6.

Méthode 3: Testez la connexion en combinaison avec Stream_Socket_Client

Dans les programmes réseau réels, vous pouvez également utiliser Stream_Socket_Client pour essayer les connexions, en prenant en charge IPv4 et IPv6:

 <?php
$hostname = "example.com";
$port = 80;
$errno = 0;
$errstr = "";

$fp = @stream_socket_client("tcp://$hostname:$port", $errno, $errstr, 5);

if ($fp) {
    $meta = stream_socket_get_name($fp, false);
    echo "Connected via IP: $meta\n";
    fclose($fp);
} else {
    echo "Failed to connect: $errstr ($errno)\n";
}
?>

Cette méthode sélectionne automatiquement l'IP appropriée (IPv4 ou IPv6) via la pile réseau sous-jacente.

Résumer

  • GethostByName ne peut analyser que les adresses IPv4 et ne prend pas en charge IPv6. Il a progressivement été considéré comme une méthode obsolète.

  • Dans les environnements IPv6, GethostByName peut entraîner l'échec de l'analyse ou renvoie des résultats incorrects.

  • Il est recommandé d'utiliser des méthodes modernes telles que dns_get_record ou socket_getaddrinfo pour obtenir des adresses IPv4 et IPv6.

  • Pour les connexions réseau, il est recommandé d'utiliser des fonctions et des interfaces qui prennent en charge IPv6 pour s'assurer que le code est compatible avec les futurs environnements réseau.