W3docs

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, use dns_get_record() em seu lugar. Este artigo aborda checkdnsrr() 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"): bool

A 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 como w3docs.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 $type padrão é MX, chamar checkdnsrr($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()?

php— editable, runs on the server

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:

TipoO que verifica
AEndereço IPv4 do host
AAAAEndereço IPv6 do host
MXRegistros de troca de e-mail (servidor de e-mail) — o padrão
NSServidores de nome autoritativos para o domínio
CNAMERegistros de nome canônico (alias)
TXTRegistros de texto livre (SPF, tokens de verificação, etc.)
SOARegistro de início de autoridade
ANYQualquer 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". Chame checkdnsrr($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ão https://w3docs.com/learn-php.
  • Um resultado false não é definitivo. Falhas de rede, resolvedores lentos ou interrupções temporárias retornam false. 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.

Prática

Prática
O que a função checkdnsrr() em PHP faz?
O que a função checkdnsrr() em PHP faz?
Was this page helpful?