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 stattdessendns_get_record(). Dieser Artikel behandeltcheckdnsrr()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"): boolDie 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 wiew3docs.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-
$typeMXist, teilt Ihnencheckdnsrr($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()?
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:
| Typ | Was geprüft wird |
|---|---|
A | IPv4-Adresse des Hosts |
AAAA | IPv6-Adresse des Hosts |
MX | Mail-Exchange-(Mail-Server-)Einträge — der Standard |
NS | Autoritative Nameserver der Domain |
CNAME | Kanonische Namens-(Alias-)Einträge |
TXT | Freitext-Einträge (SPF, Verifizierungs-Token usw.) |
SOA | Start-of-Authority-Eintrag |
ANY | Alle 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 Siecheckdnsrr($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, nichthttps://w3docs.com/learn-php. - Ein
false-Ergebnis ist nicht eindeutig. Netzwerkausfälle, langsame Resolver oder vorübergehende Ausfälle liefern allefalse. 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.