W3docs

PHP gethostbyname()-Funktion: Alles, was Sie wissen müssen

Als PHP-Entwickler müssen Sie möglicherweise die IP-Adresse eines Hostnamens ermitteln. Die PHP-Funktion gethostbyname() ist dafür die richtige Wahl.

Wenn Ihr Code wissen muss, wo ein Server im Netzwerk tatsächlich erreichbar ist — um ihn zu pingen, eine Socket-Verbindung aufzubauen, die aufgelöste Adresse zu protokollieren oder sie auf einer Whitelist einzutragen — beginnen Sie mit einem Hostnamen wie example.com und fragen DNS nach der IP. PHPs gethostbyname() erledigt genau das: Gegeben einen Hostnamen, gibt sie die entsprechende IPv4-Adresse als string zurück.

Dieses Kapitel behandelt, was die Funktion zurückgibt, die Falle, in die die meisten Entwickler tappen (wie sie Fehler signalisiert), und die gängigen Muster zur Verwendung.

Syntax

gethostbyname(string $hostname): string

Die Funktion nimmt einen einzelnen Parameter:

  • $hostname — der aufzulösende Hostname, zum Beispiel "www.example.com".

Die Funktion führt einen DNS-Lookup (eine A-Record-Abfrage) durch und gibt die erste gefundene IPv4-Adresse als Punkt-getrennte Zeichenfolge zurück, z. B. "93.184.216.34".

gethostbyname() löst ausschließlich IPv4 (A-Records) auf. Es gibt kein IPv6-Äquivalent in dieser Funktionsfamilie — für AAAA-Records verwenden Sie dns_get_record() mit dem Typ DNS_AAAA.

Einfaches Beispiel

php— editable, runs on the server

Die Funktion führt einen DNS-Lookup für "example.com" durch und gibt eine Zeile wie diese aus:

The IP address for host name example.com is 93.184.216.34

Die genaue IP kann sich im Laufe der Zeit ändern und je nach Region unterschiedlich sein, da sie aus dem Live-DNS stammt.

Die Fehler-Falle: Die Funktion gibt den Hostnamen unverändert zurück

Das ist das wichtigste Detail. gethostbyname() gibt bei einem Fehler nicht false zurück und wirft auch keine Ausnahme. Wenn der Lookup fehlschlägt — der Name existiert nicht oder DNS ist nicht erreichbar — gibt die Funktion den übergebenen $hostname-string unverändert zurück.

Sie können also nicht einfach if ($ip) prüfen. Sie müssen überprüfen, ob das Ergebnis tatsächlich wie eine IP-Adresse aussieht:

<?php

$hostname = "this-host-does-not-exist.invalid";
$ip = gethostbyname($hostname);

if ($ip === $hostname) {
    echo "Could not resolve $hostname";
} else {
    echo "Resolved $hostname to $ip";
}

Eine robustere Prüfung besteht darin, das Ergebnis mit filter_var() zu validieren, was auch in dem seltenen Fall funktioniert, in dem der Hostname selbst wie eine IP aussieht:

<?php

$hostname = "example.com";
$ip = gethostbyname($hostname);

if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
    echo "Resolved to a valid IPv4 address: $ip";
} else {
    echo "Resolution failed for $hostname";
}

Alle Adressen mit gethostbynamel() abrufen

gethostbyname() gibt nur eine Adresse zurück, selbst wenn ein Hostname auf mehrere IPs zeigt (was bei lastverteilten Diensten häufig vorkommt). Um die vollständige Liste zu erhalten, verwenden Sie die verwandte Funktion gethostbynamel(), die ein array aller IPv4-Adressen zurückgibt:

<?php

$ips = gethostbynamel("example.com");

if ($ips === false) {
    echo "Lookup failed.";
} else {
    foreach ($ips as $ip) {
        echo $ip . PHP_EOL;
    }
}

Beachten Sie, dass gethostbynamel() bei einem Fehler false zurückgibt, anders als gethostbyname().

Die umgekehrte Richtung

Wenn Sie bereits eine IP-Adresse haben und den dazugehörigen Hostnamen ermitteln möchten, verwenden Sie die inverse Funktion gethostbyaddr():

<?php

$host = gethostbyaddr("93.184.216.34");
echo $host;

Wann sollte sie verwendet werden?

  • Auflösen eines konfigurierten Hostnamens zu einer IP, bevor eine Low-Level-Socket-Verbindung geöffnet wird.
  • Protokollierung der aufgelösten Adresse zusammen mit Anfragen für Auditing oder Rate-Limiting.
  • Schnelle Verbindungs- oder DNS-Integritätsprüfungen in Skripten und Health-Probes.

Für umfangreichere DNS-Aufgaben — Mailserver, alle Record-Typen, TTLs — greifen Sie stattdessen auf dns_get_record(), checkdnsrr() oder dns_get_mx() zurück.

Fazit

gethostbyname() wandelt einen Hostnamen mit einer einzigen Codezeile in eine einzelne IPv4-Adresse um. Denken Sie an die eine Eigenheit: Bei einem Fehler gibt die Funktion den Hostnamen zurück, anstatt false zu liefern — validieren Sie das Ergebnis also immer, bevor Sie ihm vertrauen. Wenn Sie alle Adressen benötigen, wechseln Sie zu gethostbynamel(); um von einer IP zurück zum Namen zu gelangen, verwenden Sie gethostbyaddr().

Übungen

Übung
Was ist der Zweck der Funktion gethostbyname() in PHP?
Was ist der Zweck der Funktion gethostbyname() in PHP?
Was this page helpful?