Signatur
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
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";
}
}
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";
}
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);
}
// 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.