Функция PHP gethostbyname(): всё, что нужно знать
Узнайте, как использовать функцию PHP gethostbyname() для получения IPv4-адреса по имени хоста, включая обработку ошибок и практические примеры.
Когда вашему коду нужно знать, где именно сервер находится в сети — чтобы выполнить ping, открыть сокет, записать разрешённый адрес или добавить его в белый список — вы начинаете с имени хоста, например example.com, и запрашиваете у DNS его IP. Функция PHP gethostbyname() делает именно это: принимает имя хоста и возвращает соответствующий IPv4-адрес в виде string.
В этой главе рассматривается, что возвращает функция, подводный камень, на который натыкается большинство разработчиков (как она сигнализирует об ошибке), и паттерны, которые реально используются на практике.
Синтаксис
gethostbyname(string $hostname): stringФункция принимает один параметр:
$hostname— имя хоста для разрешения, например"www.example.com".
Функция выполняет DNS-запрос (запрос записи A) и возвращает первый найденный IPv4-адрес в виде строки с точками-разделителями, например "93.184.216.34".
gethostbyname()разрешает только IPv4 (записиA). В этом семействе функций нет аналога для IPv6 — для записейAAAAиспользуйтеdns_get_record()с типомDNS_AAAA.
Базовый пример
Функция выполняет DNS-запрос для "example.com" и выводит строку вида:
The IP address for host name example.com is 93.184.216.34Точный IP может меняться со временем и различаться в зависимости от региона, поскольку он берётся из живого DNS.
Подводный камень при ошибке: функция возвращает имя хоста без изменений
Это самая важная деталь. gethostbyname() не возвращает false и не выбрасывает исключение при ошибке. Если разрешение завершилось неудачей — имя не существует или DNS недоступен — функция возвращает переданную вами строку $hostname без изменений.
Поэтому нельзя просто проверить if ($ip). Нужно убедиться, что результат действительно похож на IP-адрес:
<?php
$hostname = "this-host-does-not-exist.invalid";
$ip = gethostbyname($hostname);
if ($ip === $hostname) {
echo "Could not resolve $hostname";
} else {
echo "Resolved $hostname to $ip";
}Более надёжная проверка — валидировать результат с помощью filter_var(), что работает даже в редком случае, когда имя хоста само по себе похоже на IP-адрес:
<?php
$hostname = "example.com";
$ip = gethostbyname($hostname);
if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
echo "Resolved to a valid IPv4 address: $ip";
} else {
echo "Resolution failed for $hostname";
}Получение всех адресов с помощью gethostbynamel()
gethostbyname() возвращает только один адрес, даже если имя хоста соответствует нескольким IP (что типично для сервисов с балансировкой нагрузки). Чтобы получить полный список, используйте родственную функцию gethostbynamel(), которая возвращает array всех IPv4-адресов:
<?php
$ips = gethostbynamel("example.com");
if ($ips === false) {
echo "Lookup failed.";
} else {
foreach ($ips as $ip) {
echo $ip . PHP_EOL;
}
}Обратите внимание, что gethostbynamel() возвращает false при ошибке, в отличие от gethostbyname().
Обратное направление
Если у вас уже есть IP-адрес и вы хотите узнать имя хоста, используйте обратную функцию gethostbyaddr():
<?php
$host = gethostbyaddr("93.184.216.34");
echo $host;Когда использовать
- Разрешение настроенного имени хоста в IP перед открытием низкоуровневого сокетного соединения.
- Запись разрешённого адреса вместе с запросами для аудита или ограничения частоты.
- Быстрые проверки подключения или DNS в скриптах и health-пробах.
Для более сложной работы с DNS — почтовые серверы, все типы записей, TTL — используйте dns_get_record(), checkdnsrr() или dns_get_mx().
Заключение
gethostbyname() превращает имя хоста в один IPv4-адрес одной строкой кода. Помните об одной особенности: при ошибке функция возвращает вам имя хоста, а не false, поэтому всегда валидируйте результат перед использованием. Когда нужны все адреса, используйте gethostbynamel(); чтобы перейти от IP обратно к имени — gethostbyaddr().