Start · Sprachen · PHP · Referenz · checkdnsrr

checkdnsrr

Funktion

Prüft, ob für einen gegebenen Hostnamen oder eine IP-Adresse DNS-Einträge eines bestimmten Typs existieren.

seit PHP 4.0.0 Kategorie: http

Signatur

checkdnsrr(string $hostname, string $type = 'MX'): bool

Beschreibung

checkdnsrr() fragt das Domain Name System (DNS) ab und gibt true zurück, wenn für den angegebenen Hostnamen oder die IP-Adresse mindestens ein DNS-Eintrag des gewünschten Typs gefunden wird. Andernfalls liefert die Funktion false. Sie ist damit ein schnelles Werkzeug, um zu prüfen, ob eine Domain grundsätzlich existiert und erreichbar ist.

Typische Einsatzgebiete sind die Validierung von E-Mail-Adressen (Prüfung auf vorhandene MX-Einträge), die Überprüfung von Domains vor der Registrierung oder Nutzung sowie einfache Erreichbarkeitstests. Der Funktionsaufruf blockiert, bis die DNS-Antwort vorliegt oder eine Zeitüberschreitung eintritt.

Folgende Eintragstypen werden unterstützt: A, MX, NS, SOA, PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT und ANY. Der Standardtyp ist MX.

Benötigt man nicht nur eine einfache Ja/Nein-Antwort, sondern die konkreten DNS-Einträge, sollte stattdessen dns_get_record() verwendet werden.

Parameter

Name Typ Default Beschreibung
$hostname Pflicht string Der zu prüfende Hostname (z. B. example.com) oder eine IP-Adresse in dotted-notation (für PTR-Abfragen).
$type string MX Der DNS-Eintragstyp, auf den geprüft wird. Erlaubte Werte: A, MX, NS, SOA, PTR, CNAME, AAAA, A6, SRV, NAPTR, TXT, ANY.

Rückgabewert

Typ
bool
Beschreibung
Gibt true zurück, wenn mindestens ein DNS-Eintrag des angegebenen Typs für den Hostnamen existiert, andernfalls false. Bei einem DNS-Fehler oder einer Zeitüberschreitung wird ebenfalls false zurückgegeben.

Beispiele

MX-Eintrag einer E-Mail-Domain prüfen

<?php
$domain = 'gmail.com';

if (checkdnsrr($domain, 'MX')) {
    echo "Die Domain '{$domain}' besitzt einen MX-Eintrag – E-Mails können zugestellt werden.";
} else {
    echo "Kein MX-Eintrag gefunden – E-Mail-Zustellung an diese Domain ist fraglich.";
}
Die Domain 'gmail.com' besitzt einen MX-Eintrag – E-Mails können zugestellt werden.

E-Mail-Adresse mit MX-Prüfung validieren

<?php
function isValidEmailDomain(string $email): bool {
    $parts = explode('@', $email, 2);
    if (count($parts) !== 2 || empty($parts[1])) {
        return false;
    }
    return checkdnsrr($parts[1], 'MX') || checkdnsrr($parts[1], 'A');
}

$emails = [
    'user@example.com',
    'user@diese-domain-gibt-es-nicht-wirklich.invalid',
];

foreach ($emails as $email) {
    $valid = isValidEmailDomain($email) ? 'gültig' : 'ungültig';
    echo "{$email}: {$valid}\n";
}
user@example.com: gültig user@diese-domain-gibt-es-nicht-wirklich.invalid: ungültig

A-Eintrag einer Domain prüfen

<?php
$host = 'php.net';

if (checkdnsrr($host, 'A')) {
    echo "{$host} hat einen A-Eintrag (IPv4).";
} else {
    echo "Kein A-Eintrag für {$host} gefunden.";
}
php.net hat einen A-Eintrag (IPv4).

// Wichtig · Fallstricke

Sicherheitshinweis: checkdnsrr() darf nicht als alleinige Validierungsmethode für E-Mail-Adressen verwendet werden. Ein vorhandener MX-Eintrag garantiert weder, dass die Adresse existiert, noch dass E-Mails tatsächlich empfangen werden. Für die vollständige Validierung sollte zusätzlich das Format der Adresse (z. B. mit filter_var() und FILTER_VALIDATE_EMAIL) geprüft werden.

Unter Windows stand diese Funktion vor PHP 5.3.0 nicht zur Verfügung. Seit PHP 5.3.0 ist sie auf allen Plattformen verfügbar.

DNS-Abfragen sind netzwerkabhängig und können je nach Serverauslastung und DNS-Resolver variieren. Bei zeitkritischen Anwendungen kann die Funktion zu unerwünschten Latenzen führen. Eine alternative, schnellere Methode ist der Einsatz von Caching-Mechanismen oder asynchronen DNS-Abfragen über externe Bibliotheken.

Bei Verwendung des Typs ANY werden alle vorhandenen Eintragstypen berücksichtigt. Das Ergebnis kann jedoch durch DNS-Server variieren, da manche Server ANY-Anfragen einschränken.