首先,我們要確保使用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";
}
}
?>