W3docs

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

Als PHP-Entwickler müssen Sie möglicherweise Domainnamen prüfen. Die PHP-Funktion checkdnsrr() hilft dabei, DNS-Einträge zu überprüfen.

Als PHP-Entwickler müssen Sie möglicherweise Domainnamen überprüfen oder feststellen, ob bestimmte DNS-Einträge vorhanden sind. Die Funktion checkdnsrr() ist eine integrierte PHP-Funktion, die genau für diesen Zweck entwickelt wurde. Sie prüft, ob ein bestimmter Typ von DNS-Eintrag für einen gegebenen Domainnamen existiert, und gibt true zurück, wenn dies der Fall ist, oder false andernfalls.

⚠️ Wichtig: checkdnsrr() wurde in PHP 8.2 als veraltet markiert und in PHP 8.4 entfernt. Verwenden Sie für moderne PHP-Anwendungen stattdessen dns_get_record(). Dieser Artikel behandelt checkdnsrr() zur Wartung von Legacy-Code und zu Bildungszwecken.

In diesem Artikel werden wir die Funktion checkdnsrr() und ihre Verwendung eingehend betrachten.

Was ist die checkdnsrr() Funktion?

checkdnsrr() (der Name steht für "check DNS resource record") ist eine integrierte PHP-Funktion, die eine Live-DNS-Abfrage durchführt und meldet, ob eine gegebene Domain mindestens einen Eintrag eines bestimmten Typs hat. Sie wird am häufigsten verwendet, um zu überprüfen, ob eine E-Mail-Adresse auf eine Domain verweist, die tatsächlich E-Mails empfangen kann, oder um zu bestätigen, dass ein Host auflösbar ist, bevor man versucht, eine Verbindung herzustellen.

Die Funktion gibt einen boolean zurück: true, wenn mindestens ein passender Eintrag vorhanden ist, false, wenn keiner vorhanden ist oder die Abfrage fehlschlägt. Da echte DNS-Server abgefragt werden, spiegelt das Ergebnis den aktuellen Zustand der Domain wider – keinen zwischengespeicherten Wert in Ihrem Code.

Syntax

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

Die Funktion akzeptiert zwei Parameter:

  • $hostname — der Domainname (oder in älteren PHP-Versionen eine IP-Adresse), den Sie prüfen möchten. Normalerweise übergeben Sie eine einfache Domain wie w3docs.com, keine vollständige URL.
  • $type — der Typ des zu suchenden DNS-Eintrags. Dieser Parameter ist optional und hat standardmäßig den Wert "MX" (Mail-Einträge), wenn er weggelassen wird.

Hinweis: Da der Standard-$type MX ist, teilt Ihnen checkdnsrr($domain) nicht mit, ob die Domain generell existiert — sondern nur, ob sie Mail-Einträge hat. Um zu prüfen, ob eine Domain überhaupt auflösbar ist, übergeben Sie "A" (oder "ANY").

Verwendung der checkdnsrr() Funktion

Hier ist ein einfaches Beispiel, das prüft, ob eine Domain Mail-(MX-)Einträge hat:

Wie verwendet man die PHP-Funktion checkdnsrr()?

php— editable, runs on the server

Da kein $type übergeben wird, wird hier auf MX-Einträge geprüft. Die Funktion gibt true zurück, wenn mindestens ein Mail-Eintrag vorhanden ist, und false andernfalls. Beachten Sie, dass DNS-Abfragen aufgrund von Netzwerkproblemen, Zeitüberschreitungen oder ungültigen Hostnamen fehlschlagen können — ein false-Ergebnis bedeutet "kein Eintrag gefunden oder die Abfrage ist fehlgeschlagen" und ist daher kein Beweis dafür, dass eine Domain nicht existiert.

Typen von DNS-Einträgen

Der Parameter $type gibt an, nach welcher Art von DNS-Eintrag gesucht werden soll. Die häufigsten Werte sind:

TypWas geprüft wird
AIPv4-Adresse des Hosts
AAAAIPv6-Adresse des Hosts
MXMail-Exchange-(Mail-Server-)Einträge — der Standard
NSAutoritative Nameserver der Domain
CNAMEKanonische Namens-(Alias-)Einträge
TXTFreitext-Einträge (SPF, Verifizierungs-Token usw.)
SOAStart-of-Authority-Eintrag
ANYAlle oben genannten

Einen bestimmten Eintragstyp prüfen

Übergeben Sie den Typ als zweites Argument, um nach etwas anderem als Mail-Einträgen zu suchen. Hier bestätigen wir, dass eine Domain zu einer IPv4-Adresse auflöst:

<?php

$domain = "w3docs.com";

if (checkdnsrr($domain, "A")) {
    echo "$domain has an A record (it resolves to an IPv4 address).";
} else {
    echo "$domain has no A record.";
}

Ein praktischer Anwendungsfall: Validierung einer E-Mail-Domain

Ein verbreiteter Praxisanwendungsfall ist die Überprüfung des Domain-Teils einer E-Mail-Adresse, bevor eine E-Mail gesendet wird. Zunächst wird das Adressformat mit filter_var() validiert, dann wird bestätigt, dass die Domain tatsächlich E-Mails empfängt:

<?php

function emailDomainHasMail(string $email): bool
{
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        return false;
    }

    $domain = substr(strrchr($email, "@"), 1);

    // Fall back to A records: a host with only an A record can still receive mail.
    return checkdnsrr($domain, "MX") || checkdnsrr($domain, "A");
}

var_dump(emailDomainHasMail("[email protected]"));     // bool(true)
var_dump(emailDomainHasMail("[email protected]")); // bool(false)

Dies sagt Ihnen nicht, ob ein bestimmtes Postfach existiert, filtert aber Tippfehler und erfundene Domains kostengünstig heraus.

Häufige Fallstricke

  • Der Standard-Typ ist MX, nicht "beliebiger Eintrag". Rufen Sie checkdnsrr($domain, "A") (oder "ANY") auf, wenn Sie einfach wissen möchten, ob eine Domain auflösbar ist.
  • Übergeben Sie einen Hostnamen, keine URL. Entfernen Sie zuerst Schema und Pfad: Verwenden Sie w3docs.com, nicht https://w3docs.com/learn-php.
  • Ein false-Ergebnis ist nicht eindeutig. Netzwerkausfälle, langsame Resolver oder vorübergehende Ausfälle liefern alle false. Behandeln Sie dies nicht als Beweis dafür, dass eine Domain in sicherheitskritischem Code ungültig ist.
  • Es wird ein Live-Netzwerkaufruf durchgeführt. Jeder Aufruf trifft einen DNS-Server; vermeiden Sie daher den Aufruf in engen Schleifen und speichern Sie Ergebnisse zwischen, wenn Sie viele Adressen validieren.

Moderne Alternative: dns_get_record()

checkdnsrr() wurde in PHP 8.2 als veraltet markiert und in PHP 8.4 entfernt. Bevorzugen Sie in aktuellem Code dns_get_record(), das die tatsächlichen Einträge anstelle eines bloßen boolean zurückgibt und Ihnen sowohl die Existenz als auch die Daten liefert:

<?php

$domain = "w3docs.com";
$records = dns_get_record($domain, DNS_MX);

if (!empty($records)) {
    echo "$domain has MX records.";
} else {
    echo "$domain has no MX records.";
}

Einen gezielten Blick auf das Abrufen von Mail-Einträgen bieten getmxrr() und dns_get_mx(). Um einen Hostnamen in seine IP-Adresse aufzulösen, verwenden Sie gethostbyname(), und für die umgekehrte Suche gethostbyaddr().

Fazit

Die Funktion checkdnsrr() ist ein nützliches Werkzeug zur Überprüfung von Domainnamen und zur Feststellung, ob ein Domainname existiert. Wenn Sie die Syntax und Verwendung der Funktion verstehen, können Sie problemlos verschiedene Typen von DNS-Einträgen für einen Domainnamen prüfen. Wir hoffen, dass dieser Artikel informativ und hilfreich beim Verständnis der Funktion checkdnsrr() in PHP war.

Übungen

Übung
Was macht die Funktion checkdnsrr() in PHP?
Was macht die Funktion checkdnsrr() in PHP?
Was this page helpful?