W3docs

Fonction PHP dns_get_record() : tout ce que vous devez savoir

En tant que développeur PHP, vous aurez parfois besoin d'obtenir différents types d'enregistrements DNS pour un nom de domaine. La fonction dns_get_record() est faite pour ça.

Lorsque votre code doit rechercher le serveur de messagerie d'un domaine, vérifier qu'un nom d'hôte se résout correctement, ou lire les enregistrements SPF/TXT pour un contrôle de délivrabilité des e-mails, vous avez besoin d'accéder au Domain Name System (DNS). La fonction intégrée dns_get_record() de PHP effectue cette recherche au niveau du protocole et vous renvoie les enregistrements sous forme de tableau PHP — sans avoir recours à dig.

Ce chapitre couvre la signature de la fonction, les types d'enregistrements qu'elle peut récupérer, la structure exacte du tableau qu'elle retourne, comment lire les sections autoritaire et additionnelle d'une réponse DNS, ainsi que les pièges à éviter (notamment la différence entre DNS_ANY et la combinaison de constantes spécifiques).

Avis de dépréciation. dns_get_record() a été dépréciée en PHP 8.3 et est prévue pour suppression dans une version ultérieure. Pour du nouveau code, préférez l'extension getdns, une bibliothèque de résolution tierce (comme react/dns), ou les fonctions auxiliaires plus ciblées checkdnsrr() et gethostbyname() lorsque vous n'avez besoin que d'une réponse oui/non ou d'un seul enregistrement A. Les concepts présentés ci-dessous s'appliquent également à ces alternatives.

Ce que fait dns_get_record()

dns_get_record() interroge le DNS pour un nom de domaine donné et retourne les resource records correspondants sous forme de tableau de tableaux associatifs. Vous choisissez le type d'enregistrement à récupérer (A, MX, TXT, etc.). Contrairement à gethostbyname(), qui ne résout un nom d'hôte que vers une seule adresse IPv4, dns_get_record() expose l'enregistrement complet — TTL, priorité, cible et champs spécifiques au type.

Syntaxe

dns_get_record(
    string $hostname,
    int $type = DNS_ANY,
    array &$authoritative_name_servers = null,
    array &$additional_records = null,
    bool $raw = false
): array|false
ParamètreDescription
$hostnameLe nom de domaine à rechercher, par ex. "php.net".
$typeUne constante DNS_* sélectionnant le type d'enregistrement. Facultatif ; par défaut DNS_ANY. Vous pouvez combiner des constantes avec l'opérateur OU — `DNS_A
&$authoritative_name_serversRempli par référence avec les enregistrements de serveur de noms (NS) faisant autorité renvoyés dans la section d'autorité de la réponse.
&$additional_recordsRempli par référence avec les enregistrements additionnels (glue) renvoyés par le serveur.
$rawLorsque true, interroge uniquement le $type exact et renvoie les enregistrements sous forme brute. Par défaut false.

La fonction retourne un array d'enregistrements, ou false en cas d'échec (par exemple, lorsque le nom d'hôte n'existe pas ou que le résolveur est inaccessible).

Une recherche de base

Chaque enregistrement retourné est un tableau associatif. Tout enregistrement contient les clés host, class, type et ttl ; les clés restantes dépendent du type d'enregistrement.

<?php

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

print_r($records);

Un résultat typique ressemble à ceci (l'IP et le TTL varieront) :

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

Comme le résultat est un simple array, vous l'itérez avec foreach et lisez directement les champs de chaque enregistrement :

<?php

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

Types d'enregistrements courants

Passez l'une de ces constantes DNS_* comme argument $type. Les clés spécifiques au type que vous pouvez attendre sont listées à côté de chacune.

ConstanteEnregistrementClés spécifiques au type
DNS_AAdresse IPv4ip
DNS_AAAAAdresse IPv6ipv6
DNS_MXServeur de messageriepri, target
DNS_NSServeur de noms faisant autoritétarget
DNS_CNAMENom canonique (alias)target
DNS_TXTEnregistrement texte (SPF, vérification)txt, entries
DNS_SOAStart of Authoritymname, rname, serial, …
DNS_ANYTout type renvoyé par le résolveurvarie

Pour récupérer plusieurs types à la fois, combinez les constantes avec l'opérateur OU bit à bit (|) :

<?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";
}

Piège — DNS_ANY vs combinaison de constantes. DNS_ANY émet une seule requête ANY, et de nombreux résolveurs et serveurs faisant autorité la refusent ou la tronquent désormais (RFC 8482). Si vous voulez des enregistrements spécifiques, combinez les constantes précises avec l'opérateur OU (DNS_A | DNS_MX | DNS_TXT) plutôt que de vous fier à DNS_ANY — c'est plus fiable et plus efficace.

Lecture des enregistrements autoritaires et additionnels

Les troisième et quatrième paramètres sont remplis par référence. Ils exposent les sections authority et additional de la réponse DNS, ce qui est utile lorsque vous avez besoin des serveurs de noms ayant répondu ou des enregistrements A de collage pour une cible MX :

<?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";

Gestion des échecs

dns_get_record() retourne false lorsque la recherche échoue. Vérifiez toujours ce cas avant d'itérer, sinon un foreach sur false déclenche un avertissement :

<?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);
}

Pour une simple vérification « cet enregistrement existe-t-il ? », checkdnsrr() est plus légère, car elle retourne un boolean au lieu de construire le tableau d'enregistrements complet.

Exemple pratique : valider le MX d'un domaine e-mail

Un cas d'usage courant consiste à confirmer qu'une adresse e-mail appartient à un domaine qui peut réellement recevoir des messages — pratique après que filter_var() a validé le format de l'adresse :

<?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)

La validation du format et la vérification de l'existence du MX sont nécessaires mais non suffisantes — elles ne prouvent pas que la boîte aux lettres spécifique existe. Il s'agit d'un premier filtre peu coûteux qui détecte les fautes de frappe et les domaines jetables avant toute tentative d'envoi.

Conclusion

dns_get_record() offre à PHP un accès direct et structuré aux données DNS : choisissez un type d'enregistrement avec une constante DNS_*, itérez le tableau retourné et lisez les champs spécifiques au type. Préférez la combinaison de constantes précises à DNS_ANY, protégez-vous toujours contre un retour false, et utilisez checkdnsrr() ou gethostbyname() lorsque vous avez besoin d'une réponse plus ciblée. Comme la fonction est en voie de suppression de PHP, isolez les appels DNS derrière un petit assistant afin de pouvoir intégrer ultérieurement l'extension getdns ou une bibliothèque de résolution sans toucher au reste de votre code.

Pratique

Pratique
Quel est le rôle de la fonction dns_get_record() en PHP ?
Quel est le rôle de la fonction dns_get_record() en PHP ?
Was this page helpful?