W3docs

Funzione PHP checkdnsrr(): tutto quello che devi sapere

Come sviluppatore PHP potresti dover verificare nomi di dominio o controllare l'esistenza di record DNS. La funzione checkdnsrr() fa al caso tuo.

Come sviluppatore PHP potresti dover verificare nomi di dominio o controllare se esistono specifici record DNS. La funzione checkdnsrr() è una funzione PHP integrata progettata proprio per questo scopo. Verifica se esiste un particolare tipo di record DNS per un dato nome di dominio e restituisce true in caso affermativo, oppure false in caso contrario.

⚠️ Importante: checkdnsrr() è stata deprecata in PHP 8.2 e rimossa in PHP 8.4. Per le applicazioni PHP moderne, utilizza dns_get_record(). Questo articolo tratta checkdnsrr() per la manutenzione del codice legacy e a scopo didattico.

In questo articolo esamineremo in dettaglio la funzione checkdnsrr() e il suo utilizzo.

Cos'è la funzione checkdnsrr()?

checkdnsrr() (il nome sta per "check DNS resource record", ovvero "controlla il record di risorsa DNS") è una funzione PHP integrata che esegue una ricerca DNS in tempo reale e indica se un dato dominio possiede almeno un record di un determinato tipo. Viene usata principalmente per verificare che un indirizzo email punti a un dominio in grado di ricevere posta, oppure per confermare che un host sia risolvibile prima di tentare una connessione.

La funzione restituisce un valore boolean: true se esiste almeno un record corrispondente, false se non ne esistono o se la ricerca fallisce. Poiché interroga i server DNS reali, il risultato riflette lo stato live del dominio, non un valore memorizzato nella cache del codice.

Sintassi

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

La funzione accetta due parametri:

  • $hostname — il nome di dominio (o, nelle versioni precedenti di PHP, un indirizzo IP) da controllare. Di norma si passa un dominio semplice come w3docs.com, non un URL completo.
  • $type — il tipo di record DNS da cercare. Questo parametro è opzionale e il valore predefinito è "MX" (record di posta) se omesso.

Nota: Poiché il valore predefinito di $type è MX, chiamare checkdnsrr($domain) non indica se il dominio esiste in generale, ma solo se possiede record di posta. Per verificare che un dominio sia risolvibile in assoluto, passa "A" (o "ANY").

Come usare la funzione checkdnsrr()

Ecco un esempio di base che verifica se un dominio ha record di posta (MX):

Come usare la funzione PHP checkdnsrr()?

php— editable, runs on the server

Poiché non viene passato alcun $type, viene eseguita la verifica per i record MX. La funzione restituisce true se esiste almeno un record di posta e false altrimenti. Tieni presente che le query DNS possono fallire a causa di problemi di rete, timeout o nomi host non validi: un risultato false significa "nessun record trovato oppure ricerca fallita", quindi non è una prova che il dominio non esista.

Tipi di record DNS

Il parametro $type specifica quale tipo di record DNS cercare. I valori più comuni sono:

TipoCosa controlla
AIndirizzo IPv4 dell'host
AAAAIndirizzo IPv6 dell'host
MXRecord di scambio della posta (mail server) — il valore predefinito
NSName server autorevoli per il dominio
CNAMERecord di nome canonico (alias)
TXTRecord di testo libero (SPF, token di verifica, ecc.)
SOARecord di start-of-authority
ANYQualsiasi dei tipi sopra elencati

Verifica di un tipo di record specifico

Passa il tipo come secondo argomento per cercare qualcosa di diverso dai record di posta. Nell'esempio seguente si verifica che un dominio si risolva in un indirizzo 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 caso d'uso pratico: validare il dominio di un'email

Un utilizzo reale comune è quello di verificare la parte relativa al dominio di un indirizzo email prima di inviargli un messaggio. Prima si valida il formato dell'indirizzo con filter_var(), poi si conferma che il dominio accetti effettivamente la posta:

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

Questo non indica se esiste una specifica casella di posta, ma elimina a basso costo errori di battitura e domini inventati.

Insidie comuni

  • Il tipo predefinito è MX, non "qualsiasi record". Chiama checkdnsrr($domain, "A") (o "ANY") se vuoi semplicemente sapere se un dominio è risolvibile.
  • Passa un nome host, non un URL. Rimuovi prima lo schema e il percorso: usa w3docs.com, non https://w3docs.com/learn-php.
  • Un risultato false non è definitivo. Errori di rete, resolver lenti o interruzioni temporanee restituiscono tutti false. Non considerarlo come prova che un dominio non è valido in codice critico per la sicurezza.
  • Esegue una chiamata di rete live. Ogni invocazione interroga un server DNS, quindi evita di chiamarla in cicli stretti; memorizza i risultati nella cache quando validi molti indirizzi.

Alternativa moderna: dns_get_record()

checkdnsrr() è stata deprecata in PHP 8.2 e rimossa in PHP 8.4. Nel codice attuale, preferisci dns_get_record(), che restituisce i record effettivi invece di un semplice boolean, fornendo sia l'esistenza che i dati:

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

Per approfondire il recupero dei record di posta, consulta getmxrr() e dns_get_mx(). Per risolvere un nome host nel suo indirizzo IP, usa gethostbyname(), e per la ricerca inversa, gethostbyaddr().

Conclusione

La funzione checkdnsrr() è uno strumento utile per verificare nomi di dominio e controllare se un dominio esiste. Comprendendo la sintassi e l'utilizzo della funzione, puoi controllare facilmente vari tipi di record DNS per un nome di dominio. Speriamo che questo articolo sia stato informativo e utile per comprendere la funzione checkdnsrr() in PHP.

Esercitazione

Pratica
Cosa fa la funzione checkdnsrr() in PHP?
Cosa fa la funzione checkdnsrr() in PHP?
Was this page helpful?