Функция PHP dns_get_mx(): всё, что нужно знать
Узнайте о функции PHP dns_get_mx(), её удалении в PHP 8.2 и современной замене dns_get_record() с флагом DNS_MX.
Как PHP-разработчику вам может потребоваться получить записи обмена почтой (MX) для доменного имени. Функция dns_get_mx() исторически использовалась для этой цели, однако была удалена в PHP 8.2. Современный подход предполагает использование dns_get_record() с флагом DNS_MX. В этой статье мы рассмотрим устаревшую функцию, причины её удаления и рекомендуемую альтернативу.
Что такое функция dns_get_mx()?
Функция dns_get_mx() была встроенной функцией PHP, которая извлекала записи обмена почтой (MX) для указанного доменного имени. MX-записи сообщают другим почтовым серверам, какие хосты отвечают за приём электронной почты для домена, упорядоченные по приоритету. dns_get_mx() являлась псевдонимом функции getmxrr() и была удалена в PHP 8.2. Рекомендуемая замена — dns_get_record($hostname, DNS_MX).
Синтаксис устаревшей dns_get_mx()
Исходная (ныне удалённая) функция была псевдонимом getmxrr() и использовала параметры-ссылки для возврата результатов:
dns_get_mx($hostname, &$mxhosts, &$weight);Функция принимала три параметра:
$hostname: доменное имя, для которого нужно получить MX-записи.$mxhosts: переменная-ссылка, заполняемая списком имён MX-хостов.$weight: необязательная переменная-ссылка, заполняемая приоритетом (предпочтением) каждого хоста.
Поскольку результаты возвращались через ссылки, а не через возвращаемое значение, функция возвращала лишь true при успехе или false при неудаче. Именно этот устаревший подход послужил причиной отказа от функции в пользу dns_get_record(), возвращающей array.
Как получать MX-записи сегодня
Современный подход — dns_get_record($hostname, DNS_MX), который возвращает array ассоциативных массивов (по одному на каждую запись) и работает во всех поддерживаемых версиях PHP:
Здесь мы получаем MX-записи для gmail.com. Функция dns_get_record() возвращает array записей при успехе или false при неудаче. Мы перебираем их с помощью foreach и выводим хост почтового сервера и его приоритет. Обратите внимание: DNS-запросы могут зависать или завершаться ошибкой при недопустимых доменах, поэтому всегда проверяйте возвращаемое значение и рассматривайте обработку тайм-аутов в продакшне.
Понимание возвращаемого массива
Каждая MX-запись представляет собой ассоциативный массив. Наиболее часто используемые ключи:
target: имя хоста почтового сервера, который должен принимать почту для домена.pri: приоритет (предпочтение) — чем меньше число, тем выше приоритет. Этот ключ заменяет старый параметр-ссылку$weight; обратите внимание: он называетсяpri, а неpriority.host: домен, которому принадлежит запись.type: тип записи, здесь всегдаMX.ttl: время (в секундах), в течение которого запись может быть кэширована.
Сортировка по приоритету
DNS не гарантирует возврат записей в порядке приоритета, поэтому выполняйте сортировку самостоятельно перед выбором почтового сервера:
<?php
$records = dns_get_record("gmail.com", DNS_MX);
usort($records, fn($a, $b) => $a['pri'] <=> $b['pri']);
foreach ($records as $record) {
echo $record['pri'] . " => " . $record['target'] . "\n";
}Почтовый клиент сначала пробует хост с наименьшим приоритетом и переходит к хостам с большими числами только в случае недоступности первого.
Связанные функции
dns_get_record()— универсальная замена; передавайтеDNS_MX,DNS_A,DNS_TXTи т.д.getmxrr()— эквивалент с параметрами-ссылками, псевдонимом которого являласьdns_get_mx().checkdnsrr()— проверяет, существует ли запись указанного типа для хоста.
Заключение
Хотя dns_get_mx() когда-то была стандартным способом получения MX-записей, она была удалена в PHP 8.2. Используйте вместо неё dns_get_record($hostname, DNS_MX) для современных и надёжных DNS-запросов. Надеемся, это руководство поможет вам эффективно реализовать поиск MX-записей в ваших PHP-приложениях.