W3docs

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

Базовый пример

php— editable, runs on the server

Функция выполняет 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().

Практика

Практика
Какова цель функции gethostbyname() в PHP?
Какова цель функции gethostbyname() в PHP?
Was this page helpful?