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, utilizadns_get_record()en su lugar. Este artículo cubrecheckdnsrr()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"): boolLa 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 comow3docs.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
$typeesMX, llamar acheckdnsrr($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()?
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:
| Tipo | Qué comprueba |
|---|---|
A | Dirección IPv4 del host |
AAAA | Dirección IPv6 del host |
MX | Registros de intercambio de correo (servidor de correo) — el valor predeterminado |
NS | Servidores de nombres autoritativos del dominio |
CNAME | Registros de nombre canónico (alias) |
TXT | Registros de texto libre (SPF, tokens de verificación, etc.) |
SOA | Registro de inicio de autoridad |
ANY | Cualquiera 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 acheckdnsrr($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, nohttps://w3docs.com/learn-php. - Un resultado
falseno es definitivo. Los fallos de red, los resolutores lentos o las interrupciones temporales también devuelvenfalse. 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.