W3docs

Функция 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() является прямой заменой без изменения интерфейса. Её сигнатура такая же:

php— editable, runs on the server

Вариант 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.

Практика

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