Функция PHP dns_check_record(): всё, что нужно знать
Узнайте о функции PHP dns_check_record(), её устаревании в PHP 8.0 и современных альтернативах: checkdnsrr() и dns_get_record().
Как PHP-разработчик, вам может потребоваться проверить DNS-записи или убедиться, что определённая запись существует для домена — например, чтобы удостовериться, что почтовый домен может принимать письма перед регистрацией пользователя. Исторически для этого использовалась функция dns_check_record().
Важно:
dns_check_record()была лишь псевдонимомcheckdnsrr(). Псевдонимdns_check_record()был признан устаревшим в PHP 7.3 и удалён в PHP 8.0 — однако самаcheckdnsrr()не устарела и работает во всех современных версиях PHP. Таким образом, в PHP 8+ есть два пути: вызыватьcheckdnsrr()для простого ответа «да/нет» или вызыватьdns_get_record(), когда нужны данные самой записи.
В этом руководстве объясняется устаревшая функция и обе современные альтернативы.
Что такое функция dns_check_record()?
Функция dns_check_record() была встроенной функцией PHP, которая проверяла, существует ли DNS-запись указанного типа для заданного доменного имени. Она возвращала boolean-значение: true, если хотя бы одна подходящая запись существовала, и false в противном случае. Поскольку имя dns_check_record() было удалено в PHP 8.0, её вызов на современной установке вызывает фатальную ошибку Call to undefined function.
Для миграции достаточно выполнить поиск и замену: dns_check_record( заменяется на checkdnsrr(. Параметры и поведение идентичны.
Как использовать функцию dns_check_record()
Использование устаревшей функции dns_check_record() было несложным. Вот её синтаксис:
Синтаксис функции PHP dns_check_record()
dns_check_record($host, $type);Функция принимает два параметра:
$host: доменное имя, которое вы хотите проверить.$type: тип DNS-записи для проверки в виде string ("A","MX","NS", …). Этот параметр необязателен и по умолчанию равен"MX", если не указан.
Вариант 1: checkdnsrr() — простая проверка «да/нет»
Если вам нужен лишь boolean-ответ («есть ли у этого домена запись данного типа?»), checkdnsrr() является прямой заменой без изменения интерфейса. Её сигнатура такая же:
Вариант 2: dns_get_record() — когда нужны данные записи
Если вам нужны фактические значения записей (IP-адреса, имена почтовых серверов, приоритеты), а не просто boolean, используйте dns_get_record(). Она возвращает array записей при успехе или пустой array при неудаче. Обратите внимание, что она использует константы DNS_* (например, DNS_A, DNS_MX), а не строковые типы, которые ожидает checkdnsrr():
<?php
$domain = "example.com";
$records = dns_get_record($domain, DNS_A);
if (!empty($records)) {
echo "DNS record exists for $domain";
echo PHP_EOL . "IP: " . $records[0]["ip"];
} else {
echo "DNS record does not exist for $domain";
}Здесь мы проверяем, существует ли запись A, а затем читаем разрешённый IPv4-адрес из первой записи. Каждый элемент возвращаемого array сам является ассоциативным array, ключи которого зависят от типа записи (ip для A, target и pri для MX и т. д.).
Типы DNS-записей
Как dns_check_record(), так и dns_get_record() могут проверять различные типы DNS-записей. Параметр $type задаёт тип DNS-записи для проверки. Вот некоторые из наиболее распространённых типов DNS-записей:
A: IPv4-адрес доменного имени.AAAA: IPv6-адрес доменного имени.MX: записи почтового обмена (почтового сервера) для доменного имени.NS: авторитативные серверы имён для доменного имени.CNAME: каноническое имя, на которое указывает псевдоним.TXT: произвольные текстовые записи, часто используемые для SPF, DKIM и верификации домена.ANY: все доступные типы записей для домена.
При запросе записи MX специализированная функция getmxrr() (и её псевдоним dns_get_mx()) может заполнить список хостов и приоритеты за один вызов.
Типичная проблема: почему запрос может завершиться неудачей
checkdnsrr() и dns_get_record() выполняют живой сетевой DNS-запрос, поэтому результаты зависят от среды выполнения:
- Отсутствие сети или изолированный хост (например, многие CI-раннеры или окружения с ограничениями общего хостинга) может привести к тому, что каждый запрос вернёт
false/пустой array даже для допустимых доменов. - Временные DNS-таймауты могут вызывать нестабильные сбои. Для логики валидации лучше осторожно обработать единичный сбой, а не сразу отказывать пользователю.
- Тип имеет значение: у домена могут быть записи
MX, но не быть записиA(или наоборот). Всегда запрашивайте именно тот тип записи, который вас интересует.
Поскольку эти функции обращаются к сети, избегайте их вызова в плотных циклах; кэшируйте результаты там, где это возможно.
Заключение
Хотя имя dns_check_record() было удалено в PHP 8.0, функциональность сохранилась: используйте checkdnsrr() для быстрой boolean-проверки или dns_get_record(), когда нужны данные самой записи. С любой из них можно надёжно проверить записи A, AAAA, MX, NS, CNAME и TXT для любого домена в современном PHP.