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 查询。
<?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 查询失败的情况。
<?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,用于日志记录。
<?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 地址。
<?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 查询。
<?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 域中使用特殊格式。该函数会自动处理转换。
最佳实践
- 缓存: 缓存结果以避免重复的 DNS 查询
- 超时:考虑为响应缓慢设置超时
- 错误处理:始终验证返回值
- 性能:避免在没有延迟的循环中使用
- 隐私:注意记录主机名的 PII(个人身份信息)
来源
本教程通过各种场景下的反向 DNS 查询的实际示例,介绍了 PHP gethostbyaddr
函数。
作者
列出 所有 PHP 网络函数。