W3docs

Fonction PHP checkdnsrr() : Tout ce que vous devez savoir

En tant que développeur PHP, vous pouvez avoir besoin de vérifier des noms de domaine ou de contrôler l'existence d'enregistrements DNS.

En tant que développeur PHP, vous pouvez avoir besoin de vérifier des noms de domaine ou de contrôler l'existence d'enregistrements DNS spécifiques. La fonction checkdnsrr() est une fonction PHP intégrée conçue à cet effet. Elle vérifie si un type spécifique d'enregistrement DNS existe pour un nom de domaine donné et renvoie true si c'est le cas, ou false dans le cas contraire.

⚠️ Important : checkdnsrr() a été dépréciée en PHP 8.2 et supprimée en PHP 8.4. Pour les applications PHP modernes, utilisez dns_get_record() à la place. Cet article couvre checkdnsrr() pour la maintenance du code hérité et à des fins pédagogiques.

Dans cet article, nous allons examiner en détail la fonction checkdnsrr() et son utilisation.

Qu'est-ce que la fonction checkdnsrr() ?

checkdnsrr() (dont le nom signifie « check DNS resource record ») est une fonction PHP intégrée qui effectue une recherche DNS en direct et indique si un domaine donné possède au moins un enregistrement d'un type particulier. Elle est le plus souvent utilisée pour valider qu'une adresse e-mail pointe vers un domaine capable de recevoir du courrier, ou pour confirmer qu'un hôte se résout avant de tenter de s'y connecter.

La fonction renvoie un boolean : true si au moins un enregistrement correspondant existe, false si aucun n'est trouvé ou si la recherche échoue. Comme elle interroge de vrais serveurs DNS, le résultat reflète l'état en direct du domaine — pas une valeur mise en cache dans votre code.

Syntaxe

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

La fonction prend deux paramètres :

  • $hostname — le nom de domaine (ou, dans les anciennes versions de PHP, une adresse IP) que vous souhaitez vérifier. Vous passez normalement un domaine simple tel que w3docs.com, et non une URL complète.
  • $type — le type d'enregistrement DNS à rechercher. Ce paramètre est optionnel et vaut par défaut "MX" (enregistrements de messagerie) s'il est omis.

Remarque : Comme le $type par défaut est MX, appeler checkdnsrr($domain) ne vous indique pas si le domaine existe en général — uniquement s'il possède des enregistrements de messagerie. Pour vérifier qu'un domaine se résout, passez "A" (ou "ANY").

Comment utiliser la fonction checkdnsrr() ?

Voici un exemple de base qui vérifie si un domaine possède des enregistrements de messagerie (MX) :

Comment utiliser la fonction PHP checkdnsrr() ?

php— editable, runs on the server

Comme aucun $type n'est passé, cela vérifie les enregistrements MX. La fonction renvoie true si au moins un enregistrement de messagerie existe et false dans le cas contraire. Gardez à l'esprit que les requêtes DNS peuvent échouer en raison de problèmes réseau, de délais d'attente ou de noms d'hôtes invalides — un résultat false signifie « aucun enregistrement trouvé ou la recherche a échoué », ce n'est donc pas la preuve qu'un domaine est inactif.

Types d'enregistrements DNS

Le paramètre $type spécifie quel type d'enregistrement DNS rechercher. Les valeurs les plus courantes sont :

TypeCe qu'il vérifie
AAdresse IPv4 de l'hôte
AAAAAdresse IPv6 de l'hôte
MXEnregistrements d'échange de courrier (serveur de messagerie) — par défaut
NSServeurs de noms faisant autorité pour le domaine
CNAMEEnregistrements de nom canonique (alias)
TXTEnregistrements texte libre (SPF, jetons de vérification, etc.)
SOAEnregistrement de début d'autorité
ANYL'un ou l'autre des types ci-dessus

Vérifier un type d'enregistrement spécifique

Passez le type en second argument pour rechercher autre chose que des enregistrements de messagerie. Ici, nous confirmons qu'un domaine se résout en une adresse IPv4 :

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

Un cas d'utilisation pratique : valider un domaine d'e-mail

Un cas d'utilisation courant en production est de vérifier la partie domaine d'une adresse e-mail avant d'y envoyer un courrier. Validez d'abord le format de l'adresse avec filter_var(), puis confirmez que le domaine accepte réellement du courrier :

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

Cela ne vous dira pas si une boîte aux lettres spécifique existe, mais cela permet d'éliminer à moindre coût les fautes de frappe et les domaines inventés.

Pièges courants

  • Le type par défaut est MX, pas « n'importe quel enregistrement ». Appelez checkdnsrr($domain, "A") (ou "ANY") si vous voulez simplement savoir si un domaine se résout.
  • Passez un nom d'hôte, pas une URL. Supprimez d'abord le schéma et le chemin : utilisez w3docs.com, pas https://w3docs.com/learn-php.
  • Un résultat false n'est pas définitif. Des pannes réseau, des résolveurs lents ou des interruptions temporaires retournent tous false. Ne le considérez pas comme la preuve qu'un domaine est invalide dans du code à enjeux de sécurité.
  • Elle effectue un appel réseau en direct. Chaque invocation sollicite un serveur DNS, évitez donc de l'appeler dans des boucles serrées ; mettez les résultats en cache lorsque vous validez de nombreuses adresses.

Alternative moderne : dns_get_record()

checkdnsrr() a été dépréciée en PHP 8.2 et supprimée en PHP 8.4. Dans le code actuel, préférez dns_get_record(), qui renvoie les enregistrements réels plutôt qu'un simple boolean, vous donnant à la fois l'existence et les données :

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

Pour une analyse ciblée de la récupération des enregistrements de messagerie, consultez getmxrr() et dns_get_mx(). Pour résoudre un nom d'hôte en adresse IP, utilisez gethostbyname(), et pour effectuer la recherche inverse, gethostbyaddr().

Conclusion

La fonction checkdnsrr() est un outil utile pour vérifier des noms de domaine et contrôler l'existence d'enregistrements DNS. En comprenant la syntaxe et l'utilisation de la fonction, vous pouvez facilement vérifier différents types d'enregistrements DNS pour un nom de domaine. Nous espérons que cet article vous a été utile et instructif pour comprendre la fonction checkdnsrr() en PHP.

Pratique

Pratique
Que fait la fonction checkdnsrr() en PHP ?
Que fait la fonction checkdnsrr() en PHP ?
Was this page helpful?