Функция 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()
В этом примере мы получаем все 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-запросов, диагностики и составления списков разрешённых адресов.