W3docs

Функция 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:

php— editable, runs on the server

Здесь мы получаем 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-приложениях.

Практика

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