ZetCode

PHP gethostbyaddr 函数

最后修改于 2025 年 4 月 4 日

PHP gethostbyaddr 函数执行反向 DNS 查询。它返回与给定 IP 地址关联的主机名。这对于识别服务器和日志记录很有用。

基本定义

gethostbyaddr 获取与 IP 地址对应的 Internet 主机名。它查询 DNS 服务器以查找 IP 地址的 PTR 记录。

语法:gethostbyaddr(string $ip): string|false。成功时返回主机名,失败时返回 IP。需要正确的 DNS 配置。

基本反向 DNS 查询

此示例演示了 IP 地址的简单反向 DNS 查询。

basic_lookup.php
<?php

declare(strict_types=1);

$ip = "93.184.216.34"; // example.com IP
$hostname = gethostbyaddr($ip);

echo "IP $ip resolves to: " . $hostname;

此代码查询 DNS 以获取与 IP 地址关联的主机名。如果不存在 PTR 记录,它将返回原始 IP。结果取决于 DNS 配置。

处理查询失败

此示例显示了如何处理反向 DNS 查询失败的情况。

failed_lookup.php
<?php

declare(strict_types=1);

$ip = "8.8.8.8"; // Google DNS (may not have PTR)
$hostname = gethostbyaddr($ip);

if ($hostname === $ip) {
    echo "No reverse DNS record found for $ip";
} else {
    echo "Reverse DNS for $ip: $hostname";
}

当不存在 PTR 记录时,gethostbyaddr 返回输入的 IP。此示例检查这种情况以检测查询失败。某些 IP 可能故意没有 PTR 记录。

查询客户端 IP

此示例对客户端 IP 地址执行反向 DNS,用于日志记录。

client_lookup.php
<?php

declare(strict_types=1);

$client_ip = $_SERVER['REMOTE_ADDR'];
$hostname = gethostbyaddr($client_ip);

echo "Client IP: $client_ip\n";
echo "Hostname: $hostname";

这有助于在日志中识别客户端,尽管许多 ISP 不为住宅 IP 设置 PTR 记录。如果可用,主机名可能会显示 ISP 或服务提供商。

批量 IP 查询

此示例在批量操作中处理多个 IP 地址。

batch_lookup.php
<?php

declare(strict_types=1);

$ips = [
    "93.184.216.34", // example.com
    "8.8.8.8",       // Google DNS
    "127.0.0.1"      // localhost
];

foreach ($ips as $ip) {
    $hostname = gethostbyaddr($ip);
    echo "$ip → $hostname\n";
}

这演示了高效处理多个 IP 地址。每个查询都是按顺序执行的。考虑在查询之间添加延迟,以避免被速率限制阻止。

IPv6 反向查询

此示例显示了 IPv6 地址的反向 DNS 查询。

ipv6_lookup.php
<?php

declare(strict_types=1);

$ipv6 = "2606:2800:220:1:248:1893:25c8:1946"; // example.com IPv6
$hostname = gethostbyaddr($ipv6);

echo "IPv6 $ipv6 resolves to: $hostname";

gethostbyaddr 可同时用于 IPv4 和 IPv6 地址。IPv6 PTR 记录在 ip6.arpa 域中使用特殊格式。该函数会自动处理转换。

最佳实践

来源

PHP gethostbyaddr 文档

本教程通过各种场景下的反向 DNS 查询的实际示例,介绍了 PHP gethostbyaddr 函数。

作者

我叫 Jan Bodnar,我是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 PHP 网络函数