Start · Sprachen · PHP · Referenz · gethostbynamel

gethostbynamel

Funktion

Gibt eine Liste aller IPv4-Adressen zurück, die einem Internet-Hostnamen zugeordnet sind.

seit PHP 4.0.0 Kategorie: http

Signatur

gethostbynamel(string $hostname): array|false

Beschreibung

gethostbynamel() führt eine DNS-Abfrage durch und gibt alle IPv4-Adressen zurück, die dem angegebenen Hostnamen zugewiesen sind. Im Gegensatz zu gethostbyname(), das nur eine einzige Adresse liefert, berücksichtigt diese Funktion, dass ein Hostname über mehrere A-Records verfügen kann (z. B. für Load-Balancing oder Hochverfügbarkeit).

Das Ergebnis ist ein numerisches Array mit IPv4-Adressen als Strings. Wenn der Hostname nicht aufgelöst werden kann oder kein A-Record existiert, wird false zurückgegeben.

Typische Einsatzgebiete sind das Auflösen von Server-Hostnamen, das Validieren von DNS-Einträgen, das Ermitteln aller IP-Adressen eines CDN-Knotens oder die einfache Netzwerkdiagnose. Die Funktion eignet sich besonders dann, wenn sichergestellt werden muss, dass alle möglichen Ziel-IPs eines Dienstes bekannt sind.

Hinweis: Die Funktion löst ausschließlich IPv4-Adressen (A-Records) auf. Für IPv6 (AAAA-Records) oder andere DNS-Eintragstypen sollte dns_get_record() verwendet werden.

Parameter

Name Typ Default Beschreibung
$hostname Pflicht string Der aufzulösende Internet-Hostname, z. B. 'www.example.com'. Ein abschließender Punkt wird ignoriert.

Rückgabewert

Typ
array|false
Beschreibung
Gibt ein numerisch indiziertes Array mit den IPv4-Adressen als Strings zurück, die dem Hostnamen zugeordnet sind. Im Fehlerfall (Hostname nicht auflösbar) wird false zurückgegeben.

Beispiele

Alle IPv4-Adressen eines Hostnamens ausgeben

<?php
$hostname = 'www.example.com';
$addresses = gethostbynamel($hostname);

if ($addresses === false) {
    echo "Hostname konnte nicht aufgelöst werden.\n";
} else {
    echo "IPv4-Adressen für $hostname:\n";
    foreach ($addresses as $ip) {
        echo '  ' . $ip . "\n";
    }
}
IPv4-Adressen für www.example.com: 93.184.216.34

Prüfen, ob eine IP-Adresse zu einem Hostnamen gehört

<?php
function ipBelongsToHost(string $ip, string $hostname): bool {
    $addresses = gethostbynamel($hostname);
    if ($addresses === false) {
        return false;
    }
    return in_array($ip, $addresses, true);
}

$ip = '93.184.216.34';
$host = 'www.example.com';

if (ipBelongsToHost($ip, $host)) {
    echo "Die IP $ip gehört zu $host.\n";
} else {
    echo "Die IP $ip gehört NICHT zu $host.\n";
}
Die IP 93.184.216.34 gehört zu www.example.com.

Fehlerbehandlung bei unbekanntem Hostnamen

<?php
$result = gethostbynamel('dieser-host-existiert-garantiert-nicht.invalid');

if ($result === false) {
    echo "DNS-Auflösung fehlgeschlagen.\n";
} else {
    print_r($result);
}
DNS-Auflösung fehlgeschlagen.

// Wichtig · Fallstricke

Sicherheitshinweis: Übergeben Sie niemals ungefilterte Benutzereingaben direkt an gethostbynamel(). Ein Angreifer könnte durch manipulierte Hostnamen interne Server oder Dienste (SSRF – Server-Side Request Forgery) ansprechen. Validieren Sie Hostnamen stets mit filter_var() oder regulären Ausdrücken, bevor Sie sie auflösen.

IPv6: Die Funktion gibt ausschließlich IPv4-Adressen zurück. Für AAAA-Records (IPv6) verwenden Sie dns_get_record($hostname, DNS_AAAA).

Caching: DNS-Ergebnisse werden vom Betriebssystem zwischengespeichert. Wiederholte Aufrufe in kurzer Zeit liefern möglicherweise denselben Cache-Stand. TTL-Änderungen wirken sich daher nicht sofort aus.

Timeout: PHP bietet keine native Möglichkeit, den DNS-Timeout für diese Funktion zu begrenzen. Bei nicht erreichbaren DNS-Servern kann es zu langen Wartezeiten kommen. In produktiven Anwendungen sollte daher ein eigenes Timeout-Konzept (z. B. per pcntl_alarm() oder asynchrone Abfragen) eingesetzt werden.