W3docs

Функция PHP gethostbynamel(): всё, что нужно знать

Функция PHP gethostbynamel() выполняет DNS-запрос и возвращает array всех IPv4-адресов для заданного имени хоста.

Разработчику на PHP может потребоваться получить каждый IP-адрес, связанный с заданным именем хоста, а не только один. Один домен нередко разрешается в несколько IP-адресов для балансировки нагрузки или повышения отказоустойчивости. Встроенная функция gethostbynamel() решает эту задачу: она выполняет DNS-запрос и возвращает array всех IPv4-адресов, соответствующих имени хоста.

На этой странице рассматривается, что возвращает gethostbynamel(), чем она отличается от gethostbyname(), как безопасно обрабатывать сбои и в каких случаях её стоит применять.

Что такое функция gethostbynamel()?

gethostbynamel() — встроенная функция PHP, которая получает список IPv4-адресов, соответствующих заданному имени интернет-хоста. Буква l в конце названия означает list (список) — это «сестринская» функция gethostbyname(), возвращающей лишь один адрес в виде string.

Внутри функция выполняет DNS-запрос записей A. Крупный сайт, например google.com, может публиковать несколько записей A, и gethostbynamel() позволяет увидеть их все, а не только первую.

Только IPv4. gethostbynamel() возвращает исключительно IPv4-адреса (записи A). IPv6-адреса (записи AAAA) она не возвращает. Для работы с IPv6 или другими типами записей используйте dns_get_record().

Как использовать функцию gethostbynamel()

Использовать gethostbynamel() несложно. Вот синтаксис:

Синтаксис PHP функции gethostbynamel()

gethostbynamel(string $hostname): array|false

Функция принимает один параметр:

  • $hostname: имя хоста, для которого нужно получить все IPv4-адреса (например, "www.example.com").

Возвращаемое значение

При успехе возвращает индексированный array строк с IPv4-адресами; если имя хоста не удалось разрешить, возвращает false.

Пример использования gethostbynamel() для получения всех IP-адресов, связанных с именем хоста:

Пример использования функции gethostbynamel()

php— editable, runs on the server

В этом примере мы получаем все IPv4-адреса, связанные с именем хоста «example.com». Функция выполняет DNS-запрос и возвращает array адресов. Затем мы перебираем array и выводим каждый адрес. Обратите внимание на строгое сравнение !== false: оно важно, потому что пустой array является «ложным» значением, тогда как неудачный запрос возвращает boolean false — явная проверка на false обеспечивает безопасный и однозначный тест.

Ожидаемый вывод

IP address for host name example.com is 93.184.216.34

Конкретные адреса зависят от текущих DNS-записей и вашей сети, поэтому могут отличаться от приведённых выше.

gethostbynamel() vs gethostbyname()

Эти две функции легко перепутать. Разница заключается в том, что они возвращают:

ФункцияВозвращаетКогда использовать
gethostbyname()Один IPv4-адрес в виде string (или неизменённое имя хоста при ошибке)Когда нужен один адрес для подключения.
gethostbynamel()Array всех IPv4-адресов (или false при ошибке)Когда нужно видеть все адреса, например для обнаружения CDN или round-robin DNS.

Распространённый паттерн — подсчёт количества адресов, которые анонсирует хост:

<?php

$hostname = "example.com";
$addresses = gethostbynamel($hostname);

if ($addresses === false) {
    echo "Could not resolve $hostname\n";
} else {
    echo $hostname . " resolves to " . count($addresses) . " IPv4 address(es):\n";
    echo implode(", ", $addresses) . "\n";
}

Ожидаемый вывод

example.com resolves to 1 IPv4 address(es):
93.184.216.34

Когда использовать gethostbynamel()

  • Обнаружение многоадресных хостов. Если домен обслуживается несколькими серверами (round-robin DNS, CDN), gethostbynamel() раскроет полный набор адресов.
  • Списки разрешённых адресов / правила брандмауэра. Разрешите имя хоста во все его IP-адреса перед составлением списка разрешённых, чтобы не пропустить ни один из бэкендов.
  • Диагностика и мониторинг. Вывод всех адресов, в которые разрешается имя, при устранении проблем с подключением.

Если вам нужна поддержка IPv6 или других типов DNS-записей (MX, TXT, CNAME), воспользуйтесь dns_get_record() или checkdnsrr().

Заключение

Функция gethostbynamel() получает полный список IPv4-адресов, связанных с заданным именем хоста, в отличие от gethostbyname(), которая возвращает только один. Понимание её поведения (только IPv4, возврат false при ошибке) и правильная обработка ошибок позволяют безопасно применять её в PHP-приложениях для DNS-запросов, диагностики и составления списков разрешённых адресов.

Практика

Практика
Что возвращает функция gethostbynamel() при успешном выполнении запроса?
Что возвращает функция gethostbynamel() при успешном выполнении запроса?
Was this page helpful?