dns_get_record

(PHP 5, PHP 7, PHP 8)

dns_get_recordLee los datos DNS asociados a un host

Descripción

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

Lee los datos DNS asociados al host hostname.

Parámetros

hostname

hostname debe ser un nombre de host DNS válido, como www.example.com. Las resoluciones inversas pueden realizarse con la notación in-addr.arpa, pero la función gethostbyaddr() es más eficiente para realizar resoluciones inversas.

Nota:

En términos de estándares DNS, las direcciones de correo electrónico se proporcionan en el formato usuario.host (por ejemplo: webmaster.example.com en lugar del formato webmaster@example.com). No se debe olvidar verificar esta dirección y modificarla si es necesario antes de pasarla a la función mail().

type

Por omisión, dns_get_record() buscará todos los recursos asociados a hostname. Para limitar la consulta, se debe utilizar una de las constantes DNS_*.

authoritative_name_servers

Pasado por referencia, y, si se proporciona, recibirá los registros de recursos para los Authoritative Name Servers.

additional_records

Pasado por referencia, y, si se proporciona, recibirá todos los registros adicionales.

raw

El type será interpretado como un ID de tipo DNS sin tratar (no se pueden utilizar las constantes DNS_*). El valor de retorno contendrá una clave data, que debe ser analizada manualmente.

Valores devueltos

dns_get_record() retorna un array de arrays asociativos, o false en caso de error. Cada array contiene como mínimo los índices siguientes:

Atributos básicos DNS
Atributo Significado
host El registro del espacio de nombres DNS que es descrito por los otros datos.
class dns_get_record() solo retorna la clase de registro Internet y, como tal, este índice siempre valdrá IN.
type String que contiene el tipo de registro. Los atributos adicionales también estarán disponibles en el array según el valor de este tipo. Consulte la tabla a continuación.
ttl "Time To Live": duración antes de la expiración del registro. Este valor es diferente de la duración original antes de la expiración, sino que es este valor menos la duración desde la última consulta al servidor DNS responsable.

Otros índices disponibles según el tipo DNS
Tipo Valor adicional
A ip: una dirección IPv4, en formato numérico.
MX pri: prioridad del servidor de correo. Los números bajos indican una prioridad alta. target: FQDN del servidor de correo. Ver también dns_get_mx().
CNAME target: FQDN del nombre del espacio DNS que sirve como alias para este registro.
NS target: FQDN del nombre del servidor que es responsable de este nombre de dominio.
PTR target: nombre de dominio al que apunta este registro.
TXT txt: string asociado arbitrariamente a este registro.
HINFO cpu: número IANA que designa el procesador de la máquina referenciada por este registro. os: número IANA que designa el sistema operativo de la máquina referenciada por este registro. Ver » Operating System Names para conocer el significado de estos valores.
CAA flags: Un campo de bits de un octeto: actualmente solo el bit 0 está definido, significando 'critical' (crítico); los otros bits están reservados y deben ser ignorados. tag: El nombre del tag CAA (string alfanumérico ASCII). value: El valor del tag CAA (string binario, puede utilizar subformatos). Para más información ver: » RFC 6844
SOA mname: FQDN de la fuente de este registro. rname: dirección de correo electrónico del contacto administrativo de este dominio. serial: número de serie del nombre de dominio. refresh: intervalo de actualización (en segundos) que los servidores de nombres secundarios deben utilizar para almacenar en caché este nombre de dominio. retry: duración (en segundos) de espera después de una actualización fallida, antes de hacer un segundo intento. expire: duración máxima (en segundos) de conservación de una copia de los datos de zona sin poder hacer una actualización. minimum-ttl: duración mínima (en segundos) durante la cual un cliente conserva datos de zona antes de que envíe una nueva consulta. Esta configuración puede ser anulada por otros registros.
AAAA ipv6: dirección IPv6
A6 masklen: longitud (en octetos) a heredar desde el objetivo especificado por chain. ipv6: dirección para que este registro específico se fusione con chain. chain: el registro padre a fusionar con los datos ipv6.
SRV pri: (prioridad) las prioridades más bajas deben ser utilizadas primero. weight: clasificación para elegir aleatoriamente entre los servidores targets. target y port: nombre de host y puerto donde el servicio está disponible. Para más información, ver: » RFC 2782
NAPTR order y pref: equivalente a pri y weight arriba. flags, services, regex, y replacement: parámetros como se definen en la » RFC 2915.

Historial de cambios

Versión Descripción
7.0.16, 7.1.2 Se agregó soporte para registros de tipo CAA.

Ejemplos

Ejemplo #1 Ejemplo con dns_get_record()

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

El resultado del ejemplo sería algo similar 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
        )

)

Ejemplo #2 Ejemplo con dns_get_record() y DNS_ANY

Como es muy común buscar la IP de un servidor, una vez que el campo MX ha sido resuelto, dns_get_record() retornará también un array en el parámetro additional_records que contendrá los registros asociados. authoritative_name_servers también es retornado conteniendo una lista de los servidores de autoridad.

<?php
/* Solicita todos ("ANY") los registros para php.net,
luego crea los arrays $authns y $addtl
conteniendo una lista de nombres de servidores, y todos
los registros que van con ellos
*/
$result = dns_get_record("php.net", DNS_ANY, $authns, $addtl);
echo
"Result = ";
print_r($result);
echo
"Auth NS = ";
print_r($authns);
echo
"Additional = ";
print_r($addtl);
?>

El resultado del ejemplo sería algo similar a:

Result = 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
        )

)
Auth NS = 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
        )

)
Additional = 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
        )

)

Ver también

add a note

User Contributed Notes 7 notes

up
29
tobias at herkula dot info
10 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
16 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
8 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