W3docs

Función PHP checkdnsrr(): Todo lo que necesitas saber

Como desarrollador PHP, puede que necesites verificar nombres de dominio o comprobar si existen registros DNS. La función checkdnsrr() es ideal para eso.

Como desarrollador PHP, puede que necesites verificar nombres de dominio o comprobar si existen registros DNS específicos. La función checkdnsrr() es una función integrada de PHP diseñada para este propósito. Comprueba si existe un tipo específico de registro DNS para un nombre de dominio dado y devuelve true si existe, o false en caso contrario.

⚠️ Importante: checkdnsrr() fue declarada obsoleta en PHP 8.2 y eliminada en PHP 8.4. Para aplicaciones PHP modernas, utiliza dns_get_record() en su lugar. Este artículo cubre checkdnsrr() para el mantenimiento de código heredado y con fines educativos.

En este artículo, analizaremos en profundidad la función checkdnsrr() y su uso.

¿Qué es la función checkdnsrr()?

checkdnsrr() (el nombre significa "check DNS resource record", es decir, comprobar registro de recursos DNS) es una función integrada de PHP que realiza una consulta DNS en tiempo real e informa si un dominio dado tiene al menos un registro de un tipo determinado. Se utiliza con mayor frecuencia para validar que una dirección de correo electrónico apunta a un dominio que puede recibir correo, o para confirmar que un host se resuelve antes de intentar conectarse a él.

La función devuelve un boolean: true si existe al menos un registro coincidente, false si no hay ninguno o si la consulta falla. Como consulta servidores DNS reales, el resultado refleja el estado actual del dominio, no un valor almacenado en caché en tu código.

Sintaxis

checkdnsrr(string $hostname, string $type = "MX"): bool

La función acepta dos parámetros:

  • $hostname — el nombre de dominio (o, en versiones anteriores de PHP, una dirección IP) que deseas comprobar. Normalmente se pasa un dominio simple como w3docs.com, no una URL completa.
  • $type — el tipo de registro DNS a buscar. Este parámetro es opcional y tiene como valor predeterminado "MX" (registros de correo) cuando se omite.

Nota: Como el valor predeterminado de $type es MX, llamar a checkdnsrr($domain) no te indica si el dominio existe en general, sino solo si tiene registros de correo. Para comprobar que un dominio se resuelve en absoluto, pasa "A" (o "ANY").

Cómo usar la función checkdnsrr()

A continuación se muestra un ejemplo básico que comprueba si un dominio tiene registros de correo (MX):

¿Cómo usar la función PHP checkdnsrr()?

php— editable, runs on the server

Como no se pasa ningún $type, esto comprueba los registros MX. La función devuelve true si existe al menos un registro de correo y false en caso contrario. Ten en cuenta que las consultas DNS pueden fallar debido a problemas de red, tiempos de espera o nombres de host no válidos; un resultado false significa "no se encontró ningún registro o la consulta falló", por lo que no es una prueba de que el dominio no exista.

Tipos de registros DNS

El parámetro $type especifica qué tipo de registro DNS se debe buscar. Los valores más comunes son:

TipoQué comprueba
ADirección IPv4 del host
AAAADirección IPv6 del host
MXRegistros de intercambio de correo (servidor de correo) — el valor predeterminado
NSServidores de nombres autoritativos del dominio
CNAMERegistros de nombre canónico (alias)
TXTRegistros de texto libre (SPF, tokens de verificación, etc.)
SOARegistro de inicio de autoridad
ANYCualquiera de los anteriores

Comprobación de un tipo de registro específico

Pasa el tipo como segundo argumento para buscar algo que no sean registros de correo. Aquí confirmamos que un dominio se resuelve en una dirección 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.";
}

Un caso de uso práctico: validar un dominio de correo electrónico

Un uso común en el mundo real es verificar de forma básica la parte del dominio de una dirección de correo electrónico antes de enviarle un mensaje. Primero valida el formato de la dirección con filter_var(), luego confirma que el dominio realmente acepta correo:

<?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)

Esto no te indicará si existe un buzón específico, pero filtra errores tipográficos y dominios inventados de forma económica.

Errores comunes

  • El tipo predeterminado es MX, no "cualquier registro". Llama a checkdnsrr($domain, "A") (o "ANY") si simplemente quieres saber si un dominio se resuelve.
  • Pasa un nombre de host, no una URL. Elimina primero el esquema y la ruta: usa w3docs.com, no https://w3docs.com/learn-php.
  • Un resultado false no es definitivo. Los fallos de red, los resolutores lentos o las interrupciones temporales también devuelven false. No lo trates como prueba de que un dominio no es válido en código de seguridad crítica.
  • Realiza una llamada de red en tiempo real. Cada invocación consulta un servidor DNS, así que evita llamarla en bucles ajustados; almacena los resultados en caché al validar muchas direcciones.

Alternativa moderna: dns_get_record()

checkdnsrr() fue declarada obsoleta en PHP 8.2 y eliminada en PHP 8.4. En el código actual, se recomienda usar dns_get_record(), que devuelve los registros reales en lugar de un boolean simple, proporcionando tanto la existencia como los datos:

<?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 un análisis detallado sobre la recuperación de registros de correo, consulta getmxrr() y dns_get_mx(). Para resolver un nombre de host en su dirección IP, usa gethostbyname(), y para hacer la búsqueda inversa, gethostbyaddr().

Conclusión

La función checkdnsrr() es una herramienta útil para verificar nombres de dominio y comprobar si existe un nombre de dominio. Al comprender la sintaxis y el uso de la función, puedes comprobar fácilmente varios tipos de registros DNS para un nombre de dominio. Esperamos que este artículo haya sido informativo y útil para comprender la función checkdnsrr() en PHP.

Práctica

Práctica
¿Qué hace la función checkdnsrr() en PHP?
¿Qué hace la función checkdnsrr() en PHP?
Was this page helpful?