Aktueller Standort: Startseite> Neueste Artikel> Ist die PHP -GetHostByName -Funktion in der IPv6 -Umgebung kompatibel? Welche Probleme und Lösungen gibt es?

Ist die PHP -GetHostByName -Funktion in der IPv6 -Umgebung kompatibel? Welche Probleme und Lösungen gibt es?

gitbox 2025-06-10

In PHP ist die GetHostByName -Funktion eine gemeinsame Methode, mit der Hostnamen in IPv4 -Adressen behoben werden. Die typische Verwendung ist sehr einfach:

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

Da die Netzwerkumgebung jedoch allmählich auf IPv6 migriert, werden viele Entwickler besorgt sein: Ist GethostbyName in der IPv6 -Umgebung kompatibel? Unterstützt es die Parsen von IPv6 -Adressen? Gibt es potenzielle Probleme? Wie löst ich es?

Der Arbeitsmechanismus von GethostbyName ist mit IPv6 kompatibel

Die GetHostByName -Funktion basiert auf herkömmlichem IPv4 -Design. Die Hauptfunktion besteht darin, die erste IPv4 -Adresszeichenfolge zurückzugeben, die dem Hostnamen entspricht. Wenn der Abfrage -Host keine IPv4 -Adresse hat und nur eine IPv6 -Adresse vorhanden ist, gibt GetHostByName möglicherweise nicht normal eine gültige IP zurück.

Einfach sagen:

  • Es wird nur IPv4 -Adressauflösung unterstützt.

  • IPv6 -Adressen werden nicht unterstützt.

  • Wenn der Hostname nur an eine IPv6 -Adresse analysiert wird, ist das Rückgabeergebnis normalerweise der Hostname selbst (was darauf hinweist, dass er nicht erfolgreich analysiert wird).

Beispielcode:

 <?php
$ip = gethostbyname("ipv6only.example.com");
echo $ip; // Mögliche Ausgabe“ipv6only.example.com”,Stattdessen IP Adresse
?>

Dies zeigt, dass in einer reinen IPv6 -Umgebung GetHostByName nur begrenzte Anwendbarkeit hat.

Bestehende Probleme

  1. IPv6 -Adresse kann nicht erhalten werden
    GetHostByName gibt nur eine IPv4 -Adresse zurück und kann keine AAAA -Datensätze verarbeiten, d. H. IPv6 -Adressen.

  2. Unzureichende Kompatibilität <br> In modernen Netzwerken verwenden immer mehr Server nur IPv6 -Adressen, und GetHostByName kann die Anforderungen nicht erfüllen.

  3. Potenzieller Fehler <br> Wenn das Programm auf GetHostByName angewiesen ist, um eine gültige IP zu erhalten, kann dies bei der Begegnung eines reinen IPv6 -Hosts zu einem Fehler oder einer logischen Ausnahme führen.

Lösung

Um mit IPv6 kompatibel zu sein, wird empfohlen, modernere Funktionen wie DNS_Get_Record oder GETDDRINFO -Funktion zu verwenden, die von PHP 7+ bereitgestellt werden, und kann auch IPv6 mit Stream_Socket_Client unterstützen.

Methode 1: Verwenden Sie DNS_get_Record , um A- und AAAA -Datensätze zu erhalten

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

// Holen Sie sich alles A Und AAAA Aufzeichnen
$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);
?>

Diese Methode kann alle IPv4- und IPv6 -Adressen erhalten, die dem Hostnamen gleichzeitig entsprechen.

Methode 2: Verwenden Sie die GetAddrinfo -Funktion (PHP 7.0+)

PHP 7.0 führte später in Socket_Getaddrinfo in Sockets -Erweiterung ein, mit dem vollständigere Adressinformationen zurückgegeben und IPv4 und IPv6 unterstützt werden können.

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

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

Diese Methode basiert auf der Installation von Sockets -Erweiterungen und unterstützt IPv6 -Adressen.

Methode 3: Testen Sie die Verbindung in Kombination mit stream_socket_client

In den tatsächlichen Netzwerkprogrammen können Sie auch Stream_Socket_Client verwenden, um Verbindungen zu probieren und IPv4 und IPv6 zu unterstützen:

 <?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";
}
?>

Diese Methode wählt automatisch die entsprechende IP (IPv4 oder IPv6) über den zugrunde liegenden Netzwerkstapel aus.

Zusammenfassen

  • GetHostByName kann nur IPv4 -Adressen analysieren und unterstützt IPv6 nicht. Es wurde allmählich als veraltete Methode angesehen.

  • In IPv6 -Umgebungen kann GetHostByName dazu führen, dass Parsen fehlschlägt oder falsche Ergebnisse zurückgibt.

  • Es wird empfohlen, moderne Methoden wie DNS_Get_Record oder Socket_Getaddrinfo zu verwenden, um IPv4- und IPv6 -Adressen zu erhalten.

  • Für Netzwerkverbindungen wird empfohlen, Funktionen und Schnittstellen zu verwenden, die IPv6 unterstützen, um sicherzustellen, dass der Code mit zukünftigen Netzwerkumgebungen kompatibel ist.