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