W3docs

Функция PHP checkdnsrr(): всё, что нужно знать

Узнайте, как использовать функцию PHP checkdnsrr() для проверки DNS-записей домена и валидации email-адресов.

Как PHP-разработчику, вам может понадобиться проверять доменные имена или выяснять, существуют ли определённые DNS-записи. Функция checkdnsrr() — это встроенная PHP-функция, созданная именно для этой цели. Она проверяет, существует ли DNS-запись определённого типа для заданного доменного имени, и возвращает true, если запись найдена, или false в противном случае.

⚠️ Важно: функция checkdnsrr() была объявлена устаревшей в PHP 8.2 и удалена в PHP 8.4. В современных PHP-приложениях используйте вместо неё dns_get_record(). Эта статья рассматривает checkdnsrr() в целях поддержки устаревшего кода и в образовательных целях.

В этой статье мы подробно рассмотрим функцию checkdnsrr() и примеры её использования.

Что такое функция checkdnsrr()?

checkdnsrr() (название расшифровывается как "check DNS resource record" — проверка DNS-ресурсной записи) — это встроенная PHP-функция, которая выполняет живой DNS-запрос и сообщает, есть ли у данного домена хотя бы одна запись указанного типа. Чаще всего она используется для проверки того, что email-адрес указывает на домен, который реально может принимать почту, или для подтверждения того, что хост разрешается, прежде чем устанавливать с ним соединение.

Функция возвращает boolean: true, если найдена хотя бы одна подходящая запись, и false, если записей нет или запрос завершился ошибкой. Поскольку функция обращается к реальным DNS-серверам, результат отражает текущее состояние домена, а не кэшированное значение в вашем коде.

Синтаксис

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

Функция принимает два параметра:

  • $hostname — доменное имя (или, в старых версиях PHP, IP-адрес), которое нужно проверить. Обычно передаётся просто домен, например w3docs.com, а не полный URL.
  • $type — тип DNS-записи для поиска. Этот параметр необязателен и по умолчанию равен "MX" (почтовые записи).

Примечание: поскольку значение $type по умолчанию — MX, вызов checkdnsrr($domain) не проверяет, существует ли домен вообще — только наличие почтовых записей. Чтобы проверить, разрешается ли домен в принципе, передайте "A" (или "ANY").

Как использовать функцию checkdnsrr()

Вот базовый пример, проверяющий наличие почтовых (MX) записей у домена:

Как использовать функцию PHP checkdnsrr()?

php— editable, runs on the server

Поскольку параметр $type не передан, проверяются записи MX. Функция возвращает true, если найдена хотя бы одна почтовая запись, и false в противном случае. Имейте в виду, что DNS-запросы могут завершаться ошибкой из-за сетевых проблем, таймаутов или некорректных имён хостов — результат false означает "запись не найдена или запрос не удался", а не является доказательством того, что домен не существует.

Типы DNS-записей

Параметр $type указывает, какой вид DNS-записи искать. Наиболее распространённые значения:

ТипЧто проверяет
AIPv4-адрес хоста
AAAAIPv6-адрес хоста
MXЗаписи почтового обмена (почтового сервера) — значение по умолчанию
NSАвторитативные серверы имён для домена
CNAMEЗаписи канонического имени (псевдонима)
TXTЗаписи произвольного текста (SPF, токены верификации и т. д.)
SOAЗапись начала зоны (Start of Authority)
ANYЛюбой из перечисленных типов

Проверка конкретного типа записи

Передайте тип вторым аргументом, чтобы искать что-то отличное от почтовых записей. Здесь мы проверяем, разрешается ли домен в 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.";
}

Практический пример: валидация домена email-адреса

Распространённый реальный сценарий использования — быстрая проверка доменной части email-адреса перед отправкой письма. Сначала проверьте формат адреса с помощью filter_var(), а затем убедитесь, что домен действительно принимает почту:

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

Это не позволит выяснить, существует ли конкретный почтовый ящик, но дёшево отсеивает опечатки и выдуманные домены.

Распространённые ошибки

  • Тип по умолчанию — MX, а не "любая запись". Вызывайте checkdnsrr($domain, "A") (или "ANY"), если просто хотите узнать, разрешается ли домен.
  • Передавайте имя хоста, а не URL. Сначала уберите схему и путь: используйте w3docs.com, а не https://w3docs.com/learn-php.
  • Результат false не является окончательным. Сетевые сбои, медленные резолверы или временные перебои — всё это возвращает false. Не используйте это как доказательство недействительности домена в критически важном для безопасности коде.
  • Функция выполняет живой сетевой запрос. Каждый вызов обращается к DNS-серверу, поэтому избегайте её вызова в плотных циклах; кэшируйте результаты при проверке множества адресов.

Современная альтернатива: dns_get_record()

Функция checkdnsrr() была объявлена устаревшей в PHP 8.2 и удалена в PHP 8.4. В современном коде предпочтительнее использовать dns_get_record(), которая возвращает сами записи, а не просто boolean, предоставляя как факт существования, так и данные:

<?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.";
}

Для детального изучения получения почтовых записей см. getmxrr() и dns_get_mx(). Для получения IP-адреса по имени хоста используйте gethostbyname(), а для обратного поиска — gethostbyaddr().

Заключение

Функция checkdnsrr() — полезный инструмент для проверки доменных имён и выяснения наличия DNS-записей. Понимая синтаксис и принципы работы функции, вы сможете легко проверять различные типы DNS-записей для любого доменного имени. Надеемся, эта статья оказалась информативной и помогла разобраться с функцией checkdnsrr() в PHP.

Практика

Практика
Что делает функция checkdnsrr() в PHP?
Что делает функция checkdnsrr() в PHP?
Was this page helpful?