Функция 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()?
Поскольку параметр $type не передан, проверяются записи MX. Функция возвращает true, если найдена хотя бы одна почтовая запись, и false в противном случае. Имейте в виду, что DNS-запросы могут завершаться ошибкой из-за сетевых проблем, таймаутов или некорректных имён хостов — результат false означает "запись не найдена или запрос не удался", а не является доказательством того, что домен не существует.
Типы DNS-записей
Параметр $type указывает, какой вид DNS-записи искать. Наиболее распространённые значения:
| Тип | Что проверяет |
|---|---|
A | IPv4-адрес хоста |
AAAA | IPv6-адрес хоста |
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.