Gethostbyname: примеры (PHP)

Полное руководство по работе с gethostbyname в PHP
Раздел: Сетевые функции
gethostbyname(string $hostname): string
Функция gethostbyname: назначение и параметры

Функция gethostbyname возвращает IPv4-адрес для указанного имени хоста. Она выполняет преобразование доменного имени в соответствующий IP-адрес, используя механизм DNS-запросов. Основное применение - получение сетевого адреса для последующего установления соединений.

Аргументы функции

Функция принимает один обязательный параметр:

  • hostname (string) - доменное имя, для которого необходимо получить IP-адрес. Может быть задано в виде FQDN (полное доменное имя) или простого имени хоста в локальной сети.

Возвращаемое значение - строка с IPv4-адресом в точечно-десятичной нотации. Если разрешение имени не удалось, возвращается исходная строка hostname.

Базовые примеры использования
Получение IP-адреса домена
<?
$ip = gethostbyname('google.com');
echo $ip;
?>
142.250.185.174
Обработка несуществующего домена
<?
$result = gethostbyname('non-existent-domain-xyz.test');
echo $result;
?>
non-existent-domain-xyz.test
Работа с локальным хостом
<?
$localIP = gethostbyname('localhost');
echo $localIP;
?>
127.0.0.1
Альтернативные функции в PHP

Возвращает массив всех IPv4-адресов для указанного хоста. Полезно, когда домен имеет несколько A-записей.

<?
$ips = gethostbynamel('google.com');
print_r($ips);
?>

Выполняет обратное преобразование - получает доменное имя по IP-адресу (обратный DNS-запрос).

<?
$host = gethostbyaddr('8.8.8.8');
echo $host;
?>
dns_get_record

Предоставляет расширенную информацию о DNS-записях, включая различные типы (A, AAAA, MX, TXT и другие). Поддерживает IPv6 через запись AAAA.

<?
$records = dns_get_record('google.com', DNS_A);
print_r($records);
?>
checkdnsrr

Проверяет наличие DNS-записей определенного типа для указанного хоста. Возвращает булево значение.

Типичные ошибки и проблемы
Некорректная обработка результата

Не проверяется, вернула ли функция IP-адрес или исходное имя при ошибке.

<?
$ip = gethostbyname('wrong-domain-12345.xyz');
// ОШИБКА: предполагается, что это IP-адрес
$parts = explode('.', $ip);
?>
Блокирующий вызов

Функция синхронна и блокирует выполнение скрипта до получения ответа от DNS-сервера, что может вызвать задержки.

Отсутствие поддержки IPv6

Функция работает только с IPv4. Для IPv6 требуется использование других методов.

<?
// Не получит IPv6-адрес
$ip = gethostbyname('ipv6.google.com');
echo $ip; // Вернет исходное имя
?>
Изменения в новых версиях PHP

В PHP 8.1.0 добавлена поддержка константы DNS_NUMERICIP в функции dns_get_record(), что улучшает парсинг IP-адресов. Основное поведение gethostbyname осталось неизменным с ранних версий. В PHP 8 улучшена обработка ошибок и предупреждений, связанных с сетевыми функциями.

Расширенные примеры применения
Проверка доступности хоста
Пример php
<?
function isHostResolvable($hostname) {
    $ip = gethostbyname($hostname);
    return $ip !== $hostname && filter_var($ip, FILTER_VALIDATE_IP);
}

echo isHostResolvable('google.com') ? 'Да' : 'Нет';
?>
Да
Сравнение с кэшированным значением
Пример php
<?
function getCachedHostIp($hostname, $cacheTime = 3600) {
    $cacheFile = '/tmp/ip_' . md5($hostname) . '.cache';
    if (file_exists($cacheFile) && time() - filemtime($cacheFile) < $cacheTime) {
        return file_get_contents($cacheFile);
    }
    $ip = gethostbyname($hostname);
    if ($ip !== $hostname) {
        file_put_contents($cacheFile, $ip);
    }
    return $ip;
}
?>
Массовое разрешение имен
Пример php
<?
$hosts = ['php.net', 'github.com', 'example.com'];
$results = [];
foreach ($hosts as $host) {
    $ip = gethostbyname($host);
    $results[$host] = ($ip === $host) ? 'Не разрешен' : $ip;
}
print_r($results);
?>
Интеграция с curl для проверки
Пример php
<?
$domain = 'api.example.com';
$ip = gethostbyname($domain);
if ($ip !== $domain) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://$ip");
    curl_setopt($ch, CURLOPT_HTTPHEADER, ["Host: $domain"]);
    // ... дальнейшая настройка curl
}
?>
Аналоги в других языках программирования

Gethostbyname в Python

Функция socket.gethostbyname() из стандартной библиотеки. В отличие от PHP, может вызывать исключения.

import socket
try:
    ip = socket.gethostbyname('google.com')
    print(ip)
except socket.gaierror:
    print('Ошибка разрешения имени')
JavaScript (Node.js)

Используется модуль dns с асинхронным API. Метод dns.resolve4() возвращает массив IPv4-адресов.

const dns = require('dns');
dns.resolve4('google.com', (err, addresses) => {
    if (err) console.log(err);
    else console.log(addresses);
});

Gethostbyname в MySQL

Функция INET_ATON() преобразует IP-адрес в числовое значение, но не выполняет DNS-запросы. Для DNS-разрешения требуется внешнее решение.

SELECT INET_ATON('192.168.1.1');
3232235777

PHP gethostbyname function comments

En
Gethostbyname Get the IPv4 address corresponding to a given Internet host name