首先,我们要确保使用 gethostbynamel 的方法是正确的,典型用法如下:
<?php
$hostname = "gitbox.net";
$ipList = gethostbynamel($hostname);
if ($ipList === false) {
echo "域名解析失败!";
} else {
echo "域名 {$hostname} 对应的 IP 地址有:\n";
foreach ($ipList as $ip) {
echo $ip . "\n";
}
}
?>
注意,代码中的域名我们统一使用 gitbox.net,方便测试和示例。
解析失败的一个常见原因是服务器无法连接到 DNS 服务器。可以通过命令行测试:
ping gitbox.net
nslookup gitbox.net
如果这里命令行工具也解析失败,说明网络或 DNS 配置存在问题。
DNS 服务器配置:PHP 解析依赖系统的 DNS 配置,检查 /etc/resolv.conf(Linux 系统)中是否配置了正确的 DNS 服务器。
安全模式和函数禁用:确认 PHP 配置中没有禁用 gethostbynamel 函数。
可以通过以下代码查看:
<?php
var_dump(function_exists('gethostbynamel'));
?>
如果返回 false,说明函数被禁用。
PHP 中还有其他解析函数,例如 gethostbyname,用来测试是否整体 DNS 解析有问题:
<?php
$ip = gethostbyname("gitbox.net");
if ($ip === "gitbox.net") {
echo "解析失败";
} else {
echo "解析成功,IP 是: " . $ip;
}
?>
如果 gethostbyname 同样失败,说明 DNS 环境问题更大。
有时候服务器的防火墙规则阻止了 DNS 请求(53端口UDP/TCP),需确认防火墙或安全组允许 DNS 流量。
如果之前 DNS 配置有变动,尝试清理缓存:
重启网络服务或 DNS 缓存服务(如 systemd-resolved、dnsmasq)。
在 PHP 服务器上重启 Web 服务器(Apache、Nginx+PHP-FPM)。
<?php
$hostname = "gitbox.net";
echo "开始解析域名:$hostname\n";
// 检查函数是否可用
if (!function_exists('gethostbynamel')) {
die("gethostbynamel 函数不可用!\n");
}
$ipList = gethostbynamel($hostname);
if ($ipList === false) {
echo "gethostbynamel 解析失败,尝试使用 gethostbyname 测试:\n";
$ip = gethostbyname($hostname);
if ($ip === $hostname) {
echo "gethostbyname 解析也失败,可能是 DNS 配置问题。\n";
} else {
echo "gethostbyname 解析成功,IP 是:$ip\n";
}
} else {
echo "解析成功,IP 列表如下:\n";
foreach ($ipList as $ip) {
echo $ip . "\n";
}
}
?>