W3docs

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

Als PHP-Entwickler müssen Sie möglicherweise verschiedene DNS-Einträge für einen Domainnamen abrufen. Die Funktion dns_get_record() hilft dabei.

Wenn Ihr Code den Mailserver einer Domain nachschlagen, prüfen muss, ob ein Hostname auflösbar ist, oder die SPF/TXT-Einträge hinter einer E-Mail-Zustellbarkeitsprüfung lesen soll, benötigen Sie Zugriff auf das Domain Name System (DNS). PHPs eingebaute Funktion dns_get_record() führt diese Abfrage auf Protokollebene durch und gibt die Einträge als PHP-array zurück — ganz ohne dig.

Dieses Kapitel behandelt die Signatur der Funktion, die Eintragstypen, die sie abrufen kann, die genaue Struktur des zurückgegebenen array, wie man die autoritativen und zusätzlichen Abschnitte einer DNS-Antwort liest sowie die Fallstricke, über die man stolpert (insbesondere den Unterschied zwischen DNS_ANY und dem Kombinieren spezifischer Konstanten).

Hinweis zur Veraltung. dns_get_record() wurde in PHP 8.3 als veraltet markiert und soll in einer späteren Version entfernt werden. Für neuen Code sollten Sie die getdns-Erweiterung, eine Drittanbieter-Resolver-Bibliothek (wie react/dns) oder die spezialisierteren Hilfsfunktionen checkdnsrr() und gethostbyname() bevorzugen, wenn Sie nur eine Ja/Nein-Antwort oder einen einzelnen A-Eintrag benötigen. Die unten erläuterten Konzepte gelten weiterhin für diese Alternativen.

Was dns_get_record() macht

dns_get_record() fragt DNS für einen Domainnamen ab und gibt die passenden Ressourceneinträge als array von assoziativen arrays zurück. Sie wählen, welchen Eintragstyp Sie abrufen möchten (A, MX, TXT usw.). Im Gegensatz zu gethostbyname(), das einen Hostnamen nur in eine einzelne IPv4-Adresse auflöst, macht dns_get_record() den vollständigen Eintrag zugänglich — TTL, Priorität, Ziel und typspezifische Felder.

Syntax

dns_get_record(
    string $hostname,
    int $type = DNS_ANY,
    array &$authoritative_name_servers = null,
    array &$additional_records = null,
    bool $raw = false
): array|false
ParameterBeschreibung
$hostnameDer nachzuschlagende Domainname, z. B. "php.net".
$typeEine DNS_*-Konstante, die den Eintragstyp auswählt. Optional; Standardwert ist DNS_ANY. Konstanten können mit OR verknüpft werden — `DNS_A
&$authoritative_name_serversWird per Referenz mit den autoritativen Nameserver-Einträgen (NS) aus dem Autoritätsabschnitt der Antwort befüllt.
&$additional_recordsWird per Referenz mit den zusätzlichen (Glue-)Einträgen befüllt, die der Server zurückgibt.
$rawWenn true, wird nur der exakte $type abgefragt und die Einträge werden in Rohform zurückgegeben. Standardwert ist false.

Die Funktion gibt ein array von Einträgen zurück oder false bei einem Fehler (zum Beispiel, wenn der Hostname nicht existiert oder der Resolver nicht erreichbar ist).

Eine einfache Abfrage

Jeder zurückgegebene Eintrag ist ein assoziatives array. Jeder Eintrag enthält die Schlüssel host, class, type und ttl; die übrigen Schlüssel hängen vom Eintragstyp ab.

<?php

$records = dns_get_record("php.net", DNS_A);

print_r($records);

Ein typisches Ergebnis sieht so aus (IP und TTL können variieren):

Array
(
    [0] => Array
        (
            [host] => php.net
            [class] => IN
            [ttl] => 3600
            [type] => A
            [ip] => 185.85.0.29
        )
)

Da das Ergebnis ein einfaches array ist, können Sie es mit foreach durchlaufen und die Felder jedes Eintrags direkt lesen:

<?php

foreach (dns_get_record("php.net", DNS_A) as $record) {
    echo $record['host'] . " -> " . $record['ip'] . "\n";
}

Häufige Eintragstypen

Übergeben Sie eine dieser DNS_*-Konstanten als $type-Argument. Die typspezifischen Schlüssel, die Sie erwarten können, sind jeweils aufgeführt.

KonstanteEintragTypspezifische Schlüssel
DNS_AIPv4-Adresseip
DNS_AAAAIPv6-Adresseipv6
DNS_MXMail-Exchangerpri, target
DNS_NSAutoritativer Nameservertarget
DNS_CNAMEKanonischer Name (Alias)target
DNS_TXTTexteintrag (SPF, Verifizierung)txt, entries
DNS_SOAStart of Authoritymname, rname, serial, …
DNS_ANYBeliebiger Typ, den der Resolver zurückgibtvariiert

Um mehrere Typen auf einmal abzurufen, kombinieren Sie die Konstanten mit dem bitweisen OR-Operator (|):

<?php

// A + MX records in a single call
$records = dns_get_record("php.net", DNS_A | DNS_MX);

foreach ($records as $record) {
    echo $record['type'] . "\n";
}

Fallstrick — DNS_ANY vs. Konstanten kombinieren. DNS_ANY stellt eine einzelne ANY-Anfrage, und viele Resolver sowie autoritative Server lehnen diese inzwischen ab oder kürzen sie (RFC 8482). Wenn Sie bestimmte Einträge benötigen, verknüpfen Sie die genauen Konstanten mit OR (DNS_A | DNS_MX | DNS_TXT), anstatt sich auf DNS_ANY zu verlassen — das ist zuverlässiger und effizienter.

Autoritative und zusätzliche Einträge lesen

Der dritte und vierte Parameter werden per Referenz befüllt. Sie machen den Autoritäts- und den Zusatz-Abschnitt der DNS-Antwort zugänglich, was nützlich ist, wenn Sie die antwortenden Nameserver oder die Glue-A-Einträge für ein MX-Ziel benötigen:

<?php

$authns = [];
$addtl  = [];

$records = dns_get_record("php.net", DNS_MX, $authns, $addtl);

echo "MX records: "         . count($records) . "\n";
echo "Authoritative NS: "   . count($authns)  . "\n";
echo "Additional records: " . count($addtl)   . "\n";

Fehlerbehandlung

dns_get_record() gibt false zurück, wenn die Abfrage fehlschlägt. Prüfen Sie dies immer, bevor Sie iterieren, da sonst ein foreach über false eine Warnung auslöst:

<?php

$records = dns_get_record("definitely-not-a-real-domain.invalid", DNS_A);

if ($records === false || $records === []) {
    echo "No records found.\n";
} else {
    print_r($records);
}

Für eine einfache "Existiert dieser Eintrag?"-Prüfung ist checkdnsrr() leichtgewichtiger, da es einen boolean zurückgibt, anstatt das vollständige Eintrags-array aufzubauen.

Praktisches Beispiel: MX einer E-Mail-Domain validieren

Ein häufiger Anwendungsfall ist die Bestätigung, dass eine E-Mail-Adresse zu einer Domain gehört, die tatsächlich E-Mails empfangen kann — praktisch, nachdem filter_var() das Adressformat validiert hat:

<?php

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

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

    return is_array($mx) && count($mx) > 0;
}

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

Formatvalidierung und MX-Existenz sind notwendige, aber keine hinreichenden Bedingungen — sie beweisen nicht, dass das spezifische Postfach existiert. Sie sind ein günstiger erster Filter, der Tippfehler und Wegwerfdomains abfängt, bevor Sie versuchen zu senden.

Fazit

dns_get_record() gibt PHP direkten, strukturierten Zugriff auf DNS-Daten: Wählen Sie einen Eintragstyp mit einer DNS_*-Konstante, iterieren Sie das zurückgegebene array und lesen Sie die typspezifischen Felder. Bevorzugen Sie das Verknüpfen präziser Konstanten gegenüber DNS_ANY, sichern Sie sich immer gegen eine false-Rückgabe ab, und greifen Sie auf checkdnsrr() oder gethostbyname() zurück, wenn Sie eine engere Antwort benötigen. Da die Funktion aus PHP entfernt wird, kapseln Sie DNS-Abfragen hinter einem kleinen Helfer, damit Sie später die getdns-Erweiterung oder eine Resolver-Bibliothek einsetzen können, ohne den Rest Ihres Codes anfassen zu müssen.

Übungen

Übung
Was ist der Zweck der Funktion dns_get_record() in PHP?
Was ist der Zweck der Funktion dns_get_record() in PHP?
Was this page helpful?