当前位置: 首页> 最新文章列表> gethostbynamel 和 gethostbyname 的区别

gethostbynamel 和 gethostbyname 的区别

gitbox 2025-05-26

一、函数定义与作用

gethostbyname(string $hostname): string

这个函数的作用是将一个主机名解析为。

$ip = gethostbyname('gitbox.net');
echo $ip;

如果主机名能成功解析,返回的是一个字符串形式的 IPv4 地址(如:192.168.1.1)。如果解析失败,返回的就是原始的主机名字符串。

gethostbynamel(string $hostname): array|false

与上面的函数不同,gethostbynamel() 返回的是该主机名对应的所有 IPv4 地址组成的数组

$ips = gethostbynamel('gitbox.net');
print_r($ips);

如果主机名无法解析,返回 false。如果成功,可能返回多个 IP 地址,比如多网卡主机、负载均衡服务等场景。


二、主要区别

方面gethostbynamegethostbynamel
返回值类型字符串数组或 false
是否支持多个 IP否,只返回一个(第一个)是,返回所有可用的 IPv4 地址
IPv6 支持
失败时返回原始主机名字符串false
推荐用途简单检查或日志记录获取所有 A 记录、负载均衡分析等

三、实际使用场景分析

  1. 网站监控或健康检查
    如果你只是想检测某个域名能否正常解析,可以使用 gethostbyname()

    $ip = gethostbyname('gitbox.net');
    if ($ip === 'gitbox.net') {
        echo "DNS 解析失败";
    } else {
        echo "DNS 解析成功,IP: $ip";
    }
    
  2. 服务器多 IP 绑定或分布式处理
    若你需要获取一个域名的所有 IP 地址,例如在 CDN、负载均衡或主从节点环境下,可以使用 gethostbynamel()

    $ips = gethostbynamel('gitbox.net');
    if ($ips === false) {
        echo "无法获取 IP 地址列表";
    } else {
        foreach ($ips as $ip) {
            echo "发现 IP:$ip\n";
        }
    }
    

四、注意事项

  • 两个函数都不支持 IPv6。若你需要支持 IPv6,请使用 dns_get_record() 并指定类型为 AAAA

  • gethostbyname() 只返回解析结果中的第一个 IP,并不能代表整个域名的访问能力。

  • 这些函数依赖于服务器的 DNS 配置,DNS 超时或解析失败会影响结果。

  • PHP 文档中已标注这两个函数为不推荐使用(deprecated),建议逐步使用更灵活的 dns_get_record() 替代。