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, utilizzadns_get_record(). Questo articolo trattacheckdnsrr()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"): boolLa 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 comew3docs.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, chiamarecheckdnsrr($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()?
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:
| Tipo | Cosa controlla |
|---|---|
A | Indirizzo IPv4 dell'host |
AAAA | Indirizzo IPv6 dell'host |
MX | Record di scambio della posta (mail server) — il valore predefinito |
NS | Name server autorevoli per il dominio |
CNAME | Record di nome canonico (alias) |
TXT | Record di testo libero (SPF, token di verifica, ecc.) |
SOA | Record di start-of-authority |
ANY | Qualsiasi 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". Chiamacheckdnsrr($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, nonhttps://w3docs.com/learn-php. - Un risultato
falsenon è definitivo. Errori di rete, resolver lenti o interruzioni temporanee restituiscono tuttifalse. 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.