Funzione PHP dns_check_record(): Tutto Quello che Devi Sapere
Scopri come verificare record DNS in PHP con dns_check_record(), checkdnsrr() e dns_get_record(), incluse le alternative moderne per PHP 8+.
Come sviluppatore PHP, potresti aver bisogno di verificare i record DNS o controllare se un record specifico esiste per un dominio — ad esempio, per convalidare che un dominio email possa ricevere messaggi prima di accettare una registrazione. Storicamente, la funzione dns_check_record() veniva utilizzata a questo scopo.
Importante:
dns_check_record()era semplicemente un alias dicheckdnsrr(). Il nome aliasdns_check_record()è stato deprecato in PHP 7.3 e rimosso in PHP 8.0 — macheckdnsrr()in sé non è deprecato e funziona ancora in ogni versione moderna di PHP. Quindi su PHP 8+ hai due strade: chiamacheckdnsrr()per una semplice risposta sì/no, oppure chiamadns_get_record()quando hai bisogno anche dei dati del record.
Questo tutorial spiega la funzione legacy e le due alternative moderne.
Cos'è la Funzione dns_check_record()?
La funzione dns_check_record() era una funzione built-in di PHP che verificava se un tipo specifico di record DNS esisteva per un determinato nome di dominio. Restituiva un valore boolean: true se esisteva almeno un record corrispondente, false altrimenti. Poiché il nome dns_check_record() è stato rimosso in PHP 8.0, chiamarla su un'installazione moderna genera un errore fatale Call to undefined function.
Per migrare, effettua una sostituzione letterale: dns_check_record( diventa checkdnsrr(. I parametri e il comportamento sono identici.
Come Usare la Funzione dns_check_record()
L'uso della funzione legacy dns_check_record() era semplice. Ecco la sua sintassi:
La sintassi della funzione PHP dns_check_record()
dns_check_record($host, $type);La funzione accetta due parametri:
$host: Il nome di dominio che vuoi controllare.$type: Il tipo di record DNS che vuoi controllare, come string ("A","MX","NS", …). Questo parametro è opzionale e il valore predefinito è"MX"se non specificato.
Opzione 1: checkdnsrr() — un semplice controllo sì/no
Se tutto ciò di cui hai bisogno è una risposta boolean ("questo dominio ha un record di questo tipo?"), checkdnsrr() è il sostituto diretto. La sua firma è la stessa:
Opzione 2: dns_get_record() — quando hai bisogno dei dati del record
Se vuoi i valori effettivi dei record (indirizzi IP, nomi host dei mail server, priorità) anziché solo un boolean, usa dns_get_record(). Restituisce un array di record se trovati, oppure un array vuoto in caso di errore. Nota che usa le costanti DNS_* (es. DNS_A, DNS_MX), non i tipi string che checkdnsrr() si aspetta:
<?php
$domain = "example.com";
$records = dns_get_record($domain, DNS_A);
if (!empty($records)) {
echo "DNS record exists for $domain";
echo PHP_EOL . "IP: " . $records[0]["ip"];
} else {
echo "DNS record does not exist for $domain";
}Qui verifichiamo se esiste un record A e poi leggiamo l'indirizzo IPv4 risolto dal primo record. Ogni elemento dell'array restituito è a sua volta un array associativo le cui chiavi dipendono dal tipo di record (ip per A, target e pri per MX, e così via).
Tipi di Record DNS
Sia dns_check_record() che dns_get_record() possono controllare vari tipi di record DNS. Il parametro $type specifica il tipo di record DNS che vuoi controllare. Ecco alcuni dei tipi di record DNS più comuni:
A: L'indirizzo IPv4 del nome di dominio.AAAA: L'indirizzo IPv6 del nome di dominio.MX: I record di scambio mail (mail server) per il nome di dominio.NS: I name server autorevoli per il nome di dominio.CNAME: Il nome canonico a cui punta un alias.TXT: Record di testo arbitrari, spesso usati per SPF, DKIM e la verifica del dominio.ANY: Ogni tipo di record disponibile per il dominio.
Quando si interroga specificamente un record MX, l'helper dedicato getmxrr() (e il suo alias dns_get_mx()) può popolare l'elenco degli host e le priorità in una sola chiamata.
Problemi Comuni: Perché una Ricerca Potrebbe Fallire
checkdnsrr() e dns_get_record() eseguono una query DNS di rete in tempo reale, quindi i risultati dipendono dall'ambiente di runtime:
- Nessuna rete o un host in sandbox (come molti runner CI o jail di hosting condiviso) può far restituire
false/vuoto a ogni ricerca anche per domini validi. - Timeout DNS transitori possono causare errori intermittenti. Per la logica di validazione, tratta un singolo errore con cautela anziché rifiutare immediatamente un utente.
- Il tipo è importante: un dominio potrebbe avere record
MXma nessun recordA(o viceversa). Interroga sempre il tipo di record che ti interessa effettivamente.
Poiché queste funzioni accedono alla rete, evita di chiamarle in cicli stretti; memorizza nella cache i risultati quando puoi.
Conclusione
Sebbene il nome dns_check_record() sia stato rimosso in PHP 8.0, la funzionalità è ancora disponibile: usa checkdnsrr() per un rapido controllo boolean, oppure dns_get_record() quando hai bisogno dei dati del record sottostante. Con entrambe, puoi verificare in modo affidabile i record A, AAAA, MX, NS, CNAME e TXT per qualsiasi dominio in PHP moderno.