PHP 8.4.0 RC3 available for testing

dns_get_record

(PHP 5, PHP 7, PHP 8)

dns_get_recordBusca registros de recursos DNS associados a um nome de host

Descrição

dns_get_record(
    string $hostname,
    int $type = DNS_ANY,
    array &$authoritative_name_servers = null,
    array &$additional_records = null,
    bool $raw = false
): array|false

Busca registros de recursos DNS associados ao nome do host informado no parâmetro hostname.

Parâmetros

hostname

hostname deve ser um nome de host DNS válido, como "www.example.com". Pesquisas reversas podem ser geradas usando a notação in-addr.arpa, mas gethostbyaddr() é mais adequada para a maioria das pesquisas reversas.

Nota:

De acordo com os padrões DNS, os endereços de e-mail são fornecidos no formato user.host (por exemplo: hostmaster.example.com em oposição a hostmaster@example.com). Certifique-se de verificar este valor e modificá-lo se necessário antes de usá-lo com funções como mail().

type

Por padrão, dns_get_record() procurará quaisquer registros de recursos associados ao hostname. Para limitar a consulta, especifique o parâmetro opcional type. Pode ser qualquer uma das seguintes constantes: DNS_A, DNS_CNAME, DNS_HINFO, DNS_CAA, DNS_MX, DNS_NS, DNS_PTR, DNS_SOA, DNS_TXT, DNS_AAAA, DNS_SRV, DNS_NAPTR, DNS_A6, DNS_ALL ou DNS_ANY.

Nota:

Devido às excentricidades no desempenho do libresolv entre plataformas, DNS_ANY nem sempre retornará todos os registros, o DNS_ALL mais lento coletará todos os registros de forma mais confiável.

Nota:

Windows: DNS_CAA não é suportado. O suporte para DNS_A6 não está implementado.

authoritative_name_servers

Passado por referência e, se fornecido, será preenchido com Registros de Recursos para os Servidores de Nomes Autoritativos.

additional_records

Passado por referência e, se fornecido, será preenchido com quaisquer Registros Adicionais.

raw

O parâmetro type será interpretado como um ID de tipo DNS bruto (as constantes DNS_* não podem ser usadas). O valor de retorno conterá uma chave data, que precisa ser analisada manualmente.

Valor Retornado

Esta função retorna um array de arrays associativos, ou false em caso de falha. Cada array associativo contém, no mínimo, as seguintes chaves:

Atributos DNS Básicos
Atributo Significado
host O registro no namespace DNS ao qual o restante dos dados associados se refere.
class dns_get_record() retorna apenas registros de classes da Internet e como tal este parâmetro sempre retornará IN.
type String contendo o tipo de registro. Atributos adicionais também estarão contidos no array resultante, dependendo do valor do tipo. Veja a tabela abaixo.
ttl "Time To Live" (tempo de vida) restante para este registro. Isto não será igual ao TTL original do registro, mas será igual ao TTL original menos qualquer período de tempo decorrido desde que o servidor de nomes autoritativo foi consultado.

Outras chaves nos arrays associativos dependentes do 'tipo'
Tipo Colunas Extras
A ip: Endereços IPv4 em notação decimal com pontos.
MX pri: Prioridade do trocador de mensagens. Números mais baixos indicam maior prioridade. target: FQDN do trocador de correio. Consulte também dns_get_mx().
CNAME target: FQDN do local no namespace DNS ao qual o registro tem alias.
NS target: FQDN do servidor de nomes que tem autoridade para este nome de host.
PTR target: Local no namespace DNS para o qual esse registro aponta.
TXT txt:Dados de string arbitrários associados a este registro.
HINFO cpu: Número IANA que designa a CPU da máquina referenciada por este registro. os: Número IANA que designa o sistema operacional na máquina referenciada por este registro. Consulte os » Operating System Names da IANA (Nomes de Sistemas Operacionais) para o significado desses valores.
CAA flags: Um campo de bits de um byte; atualmente apenas o bit 0 está definido, significando 'crítico'; outros bits são reservados e devem ser ignorados. tag: O nome da tag CAA (sequência alfanumérica ASCII). value: O valor da tag CAA (string binária, pode usar subformatos). Para obter informações adicionais, consulte: » RFC 6844
SOA mname: FQDN da máquina da qual os registros de recursos foram originados. rname: Endereço de e-mail do contato administrativo deste domínio. serial: Número de série desta revisão do domínio solicitado. refresh: Intervalo de atualização (segundos) que os servidores de nomes secundários devem usar ao atualizar cópias remotas deste domínio. retry: Tempo (segundos) de espera após uma atualização com falha antes de fazer uma segunda tentativa. expire: Período máximo de tempo (segundos) que um servidor DNS secundário deve reter cópias remotas dos dados da zona sem uma atualização bem-sucedida antes de descartar. minimum-ttl: Período mínimo de tempo (segundos) que um cliente pode continuar a usar uma resolução DNS antes de solicitar uma nova resolução do servidor. Pode ser substituído por registros de recursos individuais.
AAAA ipv6: Endereço IPv6
A6 masklen: Comprimento (em bits) a ser herdado do destino especificado por chain. ipv6: Endereço para este registro específico ser mesclado com chain. chain: Registro pai para mesclar com dados ipv6.
SRV pri: (Prioridade) as prioridades mais baixas devem ser usadas primeiro. weight: Classificação para ponderar quais dos targets comumente priorizados devem ser escolhidos aleatoriamente. target e port: nome do host e porta onde o serviço solicitado pode ser encontrado. Para obter informações adicionais, consulte: » RFC 2782.
NAPTR order e pref: Equivalente a pri e weight acima. flags, services, regex e replacement: Parâmetros como definidos pela » RFC 2915.

Registro de Alterações

Versão Descrição
7.0.16, 7.1.2 Adicionado suporte para tipo de registro CAA.

Exemplos

Exemplo #1 Usando dns_get_record()

<?php
$result
= dns_get_record("php.net");
print_r($result);
?>

O exemplo acima produzirá algo semelhante a:

Array
(
    [0] => Array
        (
            [host] => php.net
            [type] => MX
            [pri] => 5
            [target] => pair2.php.net
            [class] => IN
            [ttl] => 6765
        )

    [1] => Array
        (
            [host] => php.net
            [type] => A
            [ip] => 64.246.30.37
            [class] => IN
            [ttl] => 8125
        )

)

Exemplo #2 Usando dns_get_record() e DNS_ANY

Como é muito comum pesquisar o endereço IP de um servidor de e-mail depois que o registro MX tenha sido resolvido, dns_get_record() também retorna um array em additional_records que contém registros associados. authoritative_name_servers também é retornado contendo uma lista de servidores de nomes autoritativos.

<?php
/* Solicita o registro "ANY" para php.net
e cria arrays $authns e $addtl
contendo uma lista de servidores de nomes e
quaisquer registros adicionais que os
acompanham */
$result = dns_get_record("php.net", DNS_ANY, $authns, $addtl);
echo
"Resultado = ";
print_r($result);
echo
"Servidor de Nomes Autoritativo = ";
print_r($authns);
echo
"Adicional = ";
print_r($addtl);
?>

O exemplo acima produzirá algo semelhante a:

Resultado = Array
(
    [0] => Array
        (
            [host] => php.net
            [type] => MX
            [pri] => 5
            [target] => pair2.php.net
            [class] => IN
            [ttl] => 6765
        )

    [1] => Array
        (
            [host] => php.net
            [type] => A
            [ip] => 64.246.30.37
            [class] => IN
            [ttl] => 8125
        )

)
Servidor de Nomes Autoritativo = Array
(
    [0] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => remote1.easydns.com
            [class] => IN
            [ttl] => 10722
        )

    [1] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => remote2.easydns.com
            [class] => IN
            [ttl] => 10722
        )

    [2] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => ns1.easydns.com
            [class] => IN
            [ttl] => 10722
        )

    [3] => Array
        (
            [host] => php.net
            [type] => NS
            [target] => ns2.easydns.com
            [class] => IN
            [ttl] => 10722
        )

)
Adicional = Array
(
    [0] => Array
        (
            [host] => pair2.php.net
            [type] => A
            [ip] => 216.92.131.5
            [class] => IN
            [ttl] => 6766
        )

    [1] => Array
        (
            [host] => remote1.easydns.com
            [type] => A
            [ip] => 64.39.29.212
            [class] => IN
            [ttl] => 100384
        )

    [2] => Array
        (
            [host] => remote2.easydns.com
            [type] => A
            [ip] => 212.100.224.80
            [class] => IN
            [ttl] => 81241
        )

    [3] => Array
        (
            [host] => ns1.easydns.com
            [type] => A
            [ip] => 216.220.40.243
            [class] => IN
            [ttl] => 81241
        )

    [4] => Array
        (
            [host] => ns2.easydns.com
            [type] => A
            [ip] => 216.220.40.244
            [class] => IN
            [ttl] => 81241
        )

)

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 7 notes

up
29
tobias at herkula dot info
9 years ago
This method has no error handling, it simply puts out "false" and it is impossible to check for NXDOMAIN, SERVFAIL, TIMEOUT or any other error...
up
15
dylan at pow7 dot com
15 years ago
Get more than one type at once like this:
<?php
$dnsr
= dns_get_record('php.net', DNS_A + DNS_NS);
print_r($dnsr);
?>

Using DNS_ALL fails on some domains where DNS_ANY works. I noticed the function getting stuck on the DNS_PTR record, which caused it to return FALSE with this error:
PHP Warning: dns_get_record(): res_nsend() failed in ....

This gets all records except DNS_PTR:
<?php
$dnsr
= dns_get_record('php.net', DNS_ALL - DNS_PTR);
print_r($dnsr);
?>
up
12
NaturalBornCamper
7 years ago
You might have the same problem as me, where testing a non-existent domain will search for a subdomain relative to the domain you are executing from, for example:

// Test with working domain
var_dump( dns_get_record('google.com', DNS_A) );
/* works, returns
Array
(
[host] => google.com
[class] => IN
[ttl] => 299
[type] => A
[ip] => 172.217.12.142
)
*/

// Test with invalid domain on our website (example.com)
var_dump( dns_get_record('invalidtestingname.com', DNS_A) );
/* Doesn't work, pretend it's a subdomain
Array
(
[host] => invalidtestingname.com.example.com
[class] => IN
[ttl] => 299
[type] => A
[ip] => xxx.xxx.xxx.xxx
)
*/

If anyone has that problem, add a "dot" at the end of the domain name, for example, instead of
dns_get_record('invalidtestingname.com', DNS_A);
Do this:
dns_get_record('invalidtestingname.com.', DNS_A);
up
13
PHP Joe
11 years ago
Although this works very well for general DNS queries if you want to do a direct DNS query to a specified DNS server (rather than using OS resolution) try PHPDNS: http://www.purplepixie.org/phpdns/

You can do direct (TCP or UDP) low-level queries to a nameserver and recurse at will. Very useful for testing specific servers and also for walking through a recursive resolution.
up
3
heinjan at eendrachtstraat dot nl
8 years ago
Please note that Firewalls and anti malware software detects (and depending on company policies even blocks) DNS_ANY requests.
In that case the usage of this function fails.
This is because DNS_ANY requests can be exploited for creating "amplification (D)DOS attackes": You send 1 DNS_ANY request and get a huge amount of information back, thus even small requests can result into hugh network load.

I advise to use a more explicit name-request instead of using DNS_ANY.
up
1
ohcc at 163 dot com
7 years ago
When I use DNS_ALL as the second parameter to invoke dns_get_record() on the OS of Windows, PHP emits a warning with the message "Warning: dns_get_record(): Type '251721779' not supported in blah.php on line blah", and DNS_ANY is always OKAY.
up
1
bohwaz
2 years ago
Sadly this method does not allow for using an arbitrary nameserver.

If you need to make a request using a specific DNS server, you'll need to use either Pear/Net_DNS2, or libdns ( https://github.com/DaveRandom/LibDNS ).

If you want something shorter and lighter, you can also use this 150 lines function: https://gist.github.com/bohwaz/ddc61c4f7e031c3221a89981e70b830c
To Top