Função PHP checkdnsrr(): Tudo o Que Você Precisa Saber
Como desenvolvedor PHP, pode ser necessário verificar nomes de domínio ou registros DNS. A função checkdnsrr() é ideal para isso.
Como desenvolvedor PHP, pode ser necessário verificar nomes de domínio ou checar se registros DNS específicos existem. A função checkdnsrr() é uma função PHP integrada projetada para essa finalidade. Ela verifica se um tipo específico de registro DNS existe para um determinado nome de domínio e retorna true se existir, ou false caso contrário.
⚠️ Importante:
checkdnsrr()foi descontinuada no PHP 8.2 e removida no PHP 8.4. Para aplicações PHP modernas, usedns_get_record()em seu lugar. Este artigo abordacheckdnsrr()para manutenção de código legado e fins educacionais.
Neste artigo, faremos uma análise aprofundada da função checkdnsrr() e seu uso.
O que é a Função checkdnsrr()?
checkdnsrr() (o nome significa "check DNS resource record", ou seja, verificar registro de recurso DNS) é uma função PHP integrada que realiza uma consulta DNS em tempo real e informa se um determinado domínio possui pelo menos um registro de um tipo específico. É usada com mais frequência para validar que um endereço de e-mail aponta para um domínio que pode realmente receber mensagens, ou para confirmar que um host resolve antes de tentar conectar-se a ele.
A função retorna um boolean: true se pelo menos um registro correspondente existir, false se nenhum existir ou se a consulta falhar. Como ela consulta servidores DNS reais, o resultado reflete o estado atual do domínio — não um valor em cache no seu código.
Sintaxe
checkdnsrr(string $hostname, string $type = "MX"): boolA função recebe dois parâmetros:
$hostname— o nome de domínio (ou, em versões mais antigas do PHP, um endereço IP) que você deseja verificar. Normalmente, passa-se um domínio simples comow3docs.com, não uma URL completa.$type— o tipo de registro DNS a ser procurado. Este parâmetro é opcional e o padrão é"MX"(registros de e-mail) quando omitido.
Nota: Como o
$typepadrão éMX, chamarcheckdnsrr($domain)não informa se o domínio existe em geral — apenas se ele possui registros de e-mail. Para verificar se um domínio resolve em absoluto, passe"A"(ou"ANY").
Como Usar a Função checkdnsrr()
Veja um exemplo básico que verifica se um domínio possui registros de e-mail (MX):
Como usar a Função PHP checkdnsrr()?
Como nenhum $type é passado, isso verifica registros MX. A função retorna true se pelo menos um registro de e-mail existir e false caso contrário. Tenha em mente que consultas DNS podem falhar devido a problemas de rede, timeouts ou nomes de host inválidos — um resultado false significa "nenhum registro encontrado ou a consulta falhou", portanto, não é prova de que um domínio está inativo.
Tipos de Registros DNS
O parâmetro $type especifica qual tipo de registro DNS deve ser procurado. Os valores mais comuns são:
| Tipo | O que verifica |
|---|---|
A | Endereço IPv4 do host |
AAAA | Endereço IPv6 do host |
MX | Registros de troca de e-mail (servidor de e-mail) — o padrão |
NS | Servidores de nome autoritativos para o domínio |
CNAME | Registros de nome canônico (alias) |
TXT | Registros de texto livre (SPF, tokens de verificação, etc.) |
SOA | Registro de início de autoridade |
ANY | Qualquer um dos acima |
Verificando um Tipo de Registro Específico
Passe o tipo como segundo argumento para procurar algo diferente de registros de e-mail. Aqui confirmamos que um domínio resolve para um endereço 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.";
}Um Caso de Uso Prático: Validando um Domínio de E-mail
Um uso comum no mundo real é verificar a parte do domínio de um endereço de e-mail antes de enviar mensagens para ele. Primeiro, valide o formato do endereço com filter_var(), depois confirme que o domínio realmente aceita e-mail:
<?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)Isso não informará se uma caixa de correio específica existe, mas filtra erros de digitação e domínios fictícios de forma simples e econômica.
Armadilhas Comuns
- O tipo padrão é
MX, não "qualquer registro". Chamecheckdnsrr($domain, "A")(ou"ANY") se você simplesmente quiser saber se um domínio resolve. - Passe um nome de host, não uma URL. Remova o esquema e o caminho primeiro: use
w3docs.com, nãohttps://w3docs.com/learn-php. - Um resultado
falsenão é definitivo. Falhas de rede, resolvedores lentos ou interrupções temporárias retornamfalse. Não trate isso como prova de que um domínio é inválido em código crítico de segurança. - Ela realiza uma chamada de rede em tempo real. Cada invocação acessa um servidor DNS, portanto, evite chamá-la em laços apertados; armazene os resultados em cache ao validar muitos endereços.
Alternativa Moderna: dns_get_record()
checkdnsrr() foi descontinuada no PHP 8.2 e removida no PHP 8.4. No código atual, prefira dns_get_record(), que retorna os registros reais em vez de um boolean simples, fornecendo tanto a existência quanto os dados:
<?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.";
}Para uma análise focada na recuperação de registros de e-mail, consulte getmxrr() e dns_get_mx(). Para resolver um nome de host para seu endereço IP, use gethostbyname() e, para a pesquisa inversa, gethostbyaddr().
Conclusão
A função checkdnsrr() é uma ferramenta útil para verificar nomes de domínio e checar se um nome de domínio existe. Ao compreender a sintaxe e o uso da função, você pode verificar facilmente vários tipos de registros DNS para um nome de domínio. Esperamos que este artigo tenha sido informativo e útil para entender a função checkdnsrr() em PHP.