gethostbyname 和 gethostbynamel 不會查詢 AAAA 記錄。我寫了兩個函式來實現這個功能:gethostbyname6 和 gethostbynamel6。我認為這個問題尚未得到解決。
它們是用來取代 gethostbyname[l] 的,如果 `$try_a` 為 true,且獲取 AAAA 記錄失敗,它會嘗試獲取 A 記錄。
歡迎更正任何錯誤,我知道它會同時要求 A 和 AAAA 記錄,這意味著兩次 DNS 呼叫…如果在查詢之前檢查 `$try_a` 可能會更有效率,但这對我來說有效,所以我把它留給其他人實作…總之,提示就在這裡了。
程式碼如下:
function gethostbyname6($host, $try_a = false) {
// 獲取 $host 的 AAAA 記錄
// 如果 $try_a 為 true,且 AAAA 失敗,則嘗試獲取 A 記錄
// 返回第一個找到的匹配項
// 否則返回 false
$dns = gethostbynamel6($host, $try_a);
if ($dns == false) { return false; }
else { return $dns[0]; }
}
function gethostbynamel6($host, $try_a = false) {
// 獲取 $host 的 AAAA 記錄
// 如果 $try_a 為 true,且 AAAA 失敗,則嘗試獲取 A 記錄
// 結果以找到的匹配類型 IP 的陣列形式返回
// 否則返回 false
$dns6 = dns_get_record($host, DNS_AAAA);
if ($try_a == true) {
$dns4 = dns_get_record($host, DNS_A);
$dns = array_merge($dns4, $dns6);
}
else { $dns = $dns6; }
$ip6 = array();
$ip4 = array();
foreach ($dns as $record) {
if ($record["type"] == "A") {
$ip4[] = $record["ip"];
}
} if ($record["type"] == "AAAA") {
$ip6[] = $record["ipv6"];
}
}
} if (count($ip6) < 1) {
if ($try_a == true) {
if (count($ip4) < 1) {
return false;
}
} else {
return $ip4;
}
}
} else {
return false;
}
}
} else {
} return $ip6;
}
}