Função PHP dns_get_record(): Tudo o Que Você Precisa Saber
Como desenvolvedor PHP, você pode precisar obter vários tipos de registros DNS para um nome de domínio. A função dns_get_record() do PHP é ideal para isso.
Quando seu código precisa buscar o servidor de e-mail de um domínio, verificar se um hostname resolve, ou ler os registros SPF/TXT por trás de uma verificação de entregabilidade de e-mail, você precisa acessar o Sistema de Nomes de Domínio (DNS). A função integrada dns_get_record() do PHP realiza essa consulta no nível de protocolo e retorna os registros para você como um array PHP — sem precisar chamar o dig externamente.
Este capítulo aborda a assinatura da função, os tipos de registros que ela pode buscar, o formato exato do array que ela retorna, como ler as seções autoritativas e adicionais de uma resposta DNS, e as armadilhas que pegam as pessoas de surpresa (especialmente a diferença entre DNS_ANY e a combinação de constantes específicas).
Aviso de depreciação.
dns_get_record()foi depreciada no PHP 8.3 e está programada para remoção em uma versão futura. Para código novo, prefira a extensãogetdns, uma biblioteca de resolver de terceiros (comoreact/dns), ou os helpers mais específicoscheckdnsrr()egethostbyname()quando você precisar apenas de uma resposta sim/não ou de um único registro A. Os conceitos abaixo ainda se aplicam a essas alternativas.
O que dns_get_record() faz
dns_get_record() consulta o DNS para um nome de domínio e retorna os registros de recurso correspondentes como um array de arrays associativos. Você escolhe qual tipo de registro buscar (A, MX, TXT, etc.). Ao contrário de gethostbyname(), que apenas resolve um hostname para um único endereço IPv4, dns_get_record() expõe o registro completo — TTL, prioridade, destino e campos específicos do tipo.
Sintaxe
dns_get_record(
string $hostname,
int $type = DNS_ANY,
array &$authoritative_name_servers = null,
array &$additional_records = null,
bool $raw = false
): array|false| Parâmetro | Descrição |
|---|---|
$hostname | O nome de domínio a ser consultado, ex.: "php.net". |
$type | Uma constante DNS_* que seleciona o tipo de registro. Opcional; o padrão é DNS_ANY. Você pode combinar constantes com OR — `DNS_A |
&$authoritative_name_servers | Preenchido por referência com os registros do servidor de nomes autoritativo (NS) retornados na seção de autoridade da resposta. |
&$additional_records | Preenchido por referência com os registros adicionais (glue) que o servidor retorna. |
$raw | Quando true, consulta apenas o $type exato e retorna os registros em formato bruto. O padrão é false. |
Retorna um array de registros, ou false em caso de falha (por exemplo, quando o hostname não existe ou o resolver está inacessível).
Uma consulta básica
Cada registro retornado é um array associativo. Todo registro contém as chaves host, class, type e ttl; as demais chaves dependem do tipo de registro.
<?php
$records = dns_get_record("php.net", DNS_A);
print_r($records);Um resultado típico é parecido com este (o IP e o TTL variam):
Array
(
[0] => Array
(
[host] => php.net
[class] => IN
[ttl] => 3600
[type] => A
[ip] => 185.85.0.29
)
)Como o resultado é um array simples, você o itera com foreach e lê os campos de cada registro diretamente:
<?php
foreach (dns_get_record("php.net", DNS_A) as $record) {
echo $record['host'] . " -> " . $record['ip'] . "\n";
}Tipos de registros comuns
Passe uma dessas constantes DNS_* como argumento $type. As chaves específicas do tipo que você pode esperar são listadas ao lado de cada uma.
| Constante | Registro | Chaves específicas do tipo |
|---|---|---|
DNS_A | Endereço IPv4 | ip |
DNS_AAAA | Endereço IPv6 | ipv6 |
DNS_MX | Servidor de e-mail | pri, target |
DNS_NS | Servidor de nomes autoritativo | target |
DNS_CNAME | Nome canônico (alias) | target |
DNS_TXT | Registro de texto (SPF, verificação) | txt, entries |
DNS_SOA | Início de autoridade | mname, rname, serial, … |
DNS_ANY | Qualquer tipo que o resolver retorne | varia |
Para buscar vários tipos de uma vez, combine as constantes com o operador OR bit a bit (|):
<?php
// A + MX records in a single call
$records = dns_get_record("php.net", DNS_A | DNS_MX);
foreach ($records as $record) {
echo $record['type'] . "\n";
}Armadilha —
DNS_ANYvs combinação de constantes.DNS_ANYemite uma única consultaANY, e muitos resolvers e servidores autoritativos agora a recusam ou truncam (RFC 8482). Se você quiser registros específicos, combine as constantes precisas com OR (DNS_A | DNS_MX | DNS_TXT) em vez de depender deDNS_ANY— é mais confiável e mais eficiente.
Lendo registros autoritativos e adicionais
O terceiro e o quarto parâmetros são preenchidos por referência. Eles expõem as seções de autoridade e adicionais da resposta DNS, o que é útil quando você precisa dos servidores de nomes que responderam ou dos registros A de glue para um destino MX:
<?php
$authns = [];
$addtl = [];
$records = dns_get_record("php.net", DNS_MX, $authns, $addtl);
echo "MX records: " . count($records) . "\n";
echo "Authoritative NS: " . count($authns) . "\n";
echo "Additional records: " . count($addtl) . "\n";Tratando falhas
dns_get_record() retorna false quando a consulta falha. Sempre verifique isso antes de iterar; caso contrário, um foreach sobre false dispara um aviso:
<?php
$records = dns_get_record("definitely-not-a-real-domain.invalid", DNS_A);
if ($records === false || $records === []) {
echo "No records found.\n";
} else {
print_r($records);
}Para uma simples verificação de "este registro existe?", checkdnsrr() é mais leve, pois retorna um boolean em vez de construir o array completo de registros.
Exemplo prático: validar o MX do domínio de um e-mail
Um uso comum no mundo real é confirmar que um endereço de e-mail pertence a um domínio que realmente pode receber mensagens — útil após filter_var() ter validado o formato do endereço:
<?php
function domainCanReceiveMail(string $email): bool
{
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
return false;
}
$domain = substr(strrchr($email, "@"), 1);
$mx = dns_get_record($domain, DNS_MX);
return is_array($mx) && count($mx) > 0;
}
var_dump(domainCanReceiveMail("[email protected]")); // bool(true)A validação de formato e a existência do MX são necessárias, mas não suficientes — elas não provam que a caixa de entrada específica existe. São um filtro inicial barato que detecta erros de digitação e domínios descartáveis antes que você tente enviar.
Conclusão
dns_get_record() oferece ao PHP acesso direto e estruturado aos dados DNS: escolha um tipo de registro com uma constante DNS_*, itere o array retornado e leia os campos específicos do tipo. Prefira combinar constantes precisas com OR em vez de DNS_ANY, sempre proteja-se contra um retorno false, e recorra a checkdnsrr() ou gethostbyname() quando precisar de uma resposta mais simples. Como a função está sendo removida do PHP, isole as consultas DNS por trás de um pequeno helper para que você possa substituir pela extensão getdns ou por uma biblioteca de resolver mais tarde, sem precisar alterar o restante do seu código.