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

Преобразование IP в доменное имя через gethostbyaddr
Раздел: Сетевые функции
gethostbyaddr(string $ip): string|false

Функция gethostbyaddr в PHP

Описание и назначение

Функция gethostbyaddr выполняет обратный DNS-запрос, преобразуя IPv4 или IPv6 адрес в соответствующее доменное имя (PTR-запись). Она используется для определения доменного имени, связанного с сетевым адресом.

Когда применяется

Использование функции актуально при анализе логов сервера, аудите сетевых подключений, построении систем мониторинга или в инструментах для сетевой диагностики. Она помогает идентифицировать источники запросов по их доменным именам.

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

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

  • ip_address (string) — IP-адрес в формате строки (например, "192.0.2.1" или "2001:db8::1").

Возвращаемое значение: строку с именем хоста при успехе или исходный IP-адрес, если преобразование не удалось.

Примеры использования gethostbyaddr

Базовый пример с IPv4
<?php
$ip = '8.8.8.8';
$hostname = gethostbyaddr($ip);
echo "IP: $ip\nИмя хоста: $hostname";
?>
IP: 8.8.8.8
Имя хоста: dns.google
Работа с IPv6 адресом
<?php
$ipv6 = '2001:4860:4860::8888';
$result = gethostbyaddr($ipv6);
echo $result;
?>
dns.google
Ситуация при неудачном запросе
<?php
$ip = '192.0.2.99'; // Тестовый IP, для которого нет PTR записи
$host = gethostbyaddr($ip);
echo ($host === $ip) ? 'Преобразование не удалось' : "Имя: $host";
?>
Преобразование не удалось

Альтернативные функции в PHP

Выполняет прямой DNS-запрос, получая IPv4 адрес по доменному имени. Для IPv6 лучше использовать gethostbynamel или dns_get_record.

dns_get_record

Получает различные типы DNS-записей, включая PTR. Позволяет более гибко работать с DNS, поддерживая множество типов записей. Для обратного преобразования адреса нужно предварительно подготовить имя для PTR-запроса.

socket_addrinfo_lookup

Функция доступна с PHP 7.2, предоставляет информацию об адресах. Может использоваться для разрешения имён, но требует более сложной обработки результатов.

Выбор функции: gethostbyaddr подходит для быстрого обратного преобразования. Для получения дополнительных DNS-данных или работы с IPv6 предпочтительнее dns_get_record.

Типичные ошибки и их предупреждение

Передача некорректного IP-адреса
<?php
$host = gethostbyaddr('invalid_ip');
echo $host; // Выведет переданную строку
?>
invalid_ip

Функция не генерирует ошибку, а возвращает исходный аргумент. Следует проверять формат адреса перед вызовом.

Длительное время выполнения

DNS-запросы могут выполняться долго из-за сетевых проблем или отсутствия ответа от серверов. В скриптах с ограничением времени выполнения это может привести к завершению работы.

Отсутствие PTR-записи

Для многих адресов, особенно динамических, обратная запись может отсутствовать. Код должен обрабатывать ситуацию, когда возвращается исходный IP.

Изменения в последних версиях PHP

В PHP 8 существенных изменений в работе функции gethostbyaddr не произошло. Она сохранила обратную совместимость с предыдущими версиями.

Начиная с PHP 5.3, функция стала корректно поддерживать IPv6-адреса. В более ранних версиях работала только с IPv4.

Важно отметить, что поведение функции зависит от настроек DNS в операционной системе и конфигурации PHP.

Расширенные примеры применения

Пакетное разрешение адресов
Пример php
<?php
$ips = ['8.8.8.8', '1.1.1.1', '208.67.222.222'];
$results = [];

foreach ($ips as $ip) {
    $hostname = gethostbyaddr($ip);
    $results[$ip] = ($hostname !== $ip) ? $hostname : 'Не найдено';
}

print_r($results);
?>
Array
(
    [8.8.8.8] => dns.google
    [1.1.1.1] => one.one.one.one
    [208.67.222.222] => resolver2.opendns.com
)
Кэширование результатов
Пример php
<?php
function getCachedHostbyaddr($ip, &$cache) {
    if (!isset($cache[$ip])) {
        $hostname = gethostbyaddr($ip);
        $cache[$ip] = ($hostname !== $ip) ? $hostname : null;
    }
    return $cache[$ip] ?? $ip;
}

$dnsCache = [];
echo getCachedHostbyaddr('8.8.4.4', $dnsCache); // Запрос в DNS
echo "\n";
echo getCachedHostbyaddr('8.8.4.4', $dnsCache); // Из кэша
?>
dns.google
dns.google
Интеграция с проверкой MX-записей
Пример php
<?php
$ip = '8.8.8.8';
$hostname = gethostbyaddr($ip);

if ($hostname !== $ip) {
    $mxRecords = [];
    getmxrr($hostname, $mxRecords);
    echo "Для хоста $hostname найдены MX-записи: ";
    print_r($mxRecords);
} else {
    echo "PTR-запись не обнаружена";
}
?>
Для хоста dns.google найдены MX-записи: Array
(
)
Обработка приватных адресов
Пример php
<?php
function isPrivateIP($ip) {
    return !filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE);
}

$ip = '192.168.1.1';
if (isPrivateIP($ip)) {
    echo "Для приватного адреса обратный DNS не запрашивается";
} else {
    echo gethostbyaddr($ip);
}
?>
Для приватного адреса обратный DNS не запрашивается

Аналоги в других языках программирования

Gethostbyaddr в Python

Используется функция socket.gethostbyaddr(), возвращающая кортеж с именем хоста, списком псевдонимов и адресами.

import socket
try:
    hostname, aliases, addresses = socket.gethostbyaddr('8.8.8.8')
    print(f'Hostname: {hostname}')
except socket.herror:
    print('Resolution failed')
Hostname: dns.google
JavaScript (Node.js)

В Node.js модуль dns предоставляет асинхронный метод reverse().

const dns = require('dns');
dns.reverse('8.8.8.8', (err, hostnames) => {
    if (err) console.log(err);
    else console.log(hostnames[0]);
});
dns.google

Gethostbyaddr в MySQL

Прямого аналога нет, но можно использовать системные вызовы через пользовательские функции или запросы к внешним службам.

Bash/Shell

Команда dig -x [IP-адрес] или nslookup [IP-адрес] выполняет обратный DNS-запрос.

PHP gethostbyaddr function comments

En
Gethostbyaddr Get the Internet host name corresponding to a given IP address