PHP에서 gethostbynamel () 함수는 호스트 이름을 구문 분석하고 호스트 이름의 모든 IPv4 주소를 포함하는 배열을 반환하는 데 사용됩니다. 이는 일부 네트워크 관련 스크립트, 특히 도메인 이름을 여러 IP에 매핑해야 할 때 매우 유용합니다. 그러나 외부 DNS 시스템에 의존하기 때문에이 기능은 고장 가능성이 있습니다. 잘못된 반환 값이 올바르게 처리되면 스크립트가 충돌하거나 예측할 수없는 동작이 발생할 수 있습니다.
$host = 'example.com';
$ipList = gethostbynamel($host);
정상적인 상황에서 $ iplist는 예를 들어 배열이됩니다.
Array
(
[0] => 93.184.216.34
)
그러나 해상도가 실패하면 (예 : 유효하지 않은 호스트 이름 또는 DNS 쿼리 타임 아웃) GethostbyNamel () 이 False를 반환합니다.
오류 반환 값은 배열이 아닌 False 입니다. 즉, 배열에 액세스하는 것처럼이 결과를 처리하려고하면 오류가 발생합니다.
foreach ($ipList as $ip) { // 만약에 $ipList 예 false,트리거됩니다 warning
echo $ip . PHP_EOL;
}
이러한 종류의 오류는 특히 유형 확인을 수행하지 않는 스크립트에서 일반적입니다.
코드의 견고성을 보장하기 위해 GethostbyNamel () 오류 반환 값을 처리하기위한 모범 사례는 다음과 같습니다.
리턴 값이 배열이라고 가정하지 마십시오. 항상 is_array ()를 사용하여 결과를 결정하십시오.
$host = 'gitbox.net';
$ipList = gethostbynamel($host);
if (is_array($ipList)) {
foreach ($ipList as $ip) {
echo "IP 주소: $ip" . PHP_EOL;
}
} else {
echo "호스트 이름을 해결할 수 없습니다: $host" . PHP_EOL;
}
DNS 쿼리 실패의 세부 사항을 기록하면 나중에 문제를 해결하는 데 도움이 될 수 있습니다.
if (!is_array($ipList)) {
error_log("DNS 분석이 실패했습니다: $host", 3, '/var/log/php-dns-errors.log');
}
PHP의 gethostbynamel () 함수는 타임 아웃 제어가 내장되어 있지 않지만 소켓 작업을 사용하거나 DIG 명령과 같은 외부 도구를 대안으로 사용할 수 있습니다.
function fallback_dns_lookup($host) {
$output = [];
exec("dig +short $host", $output);
return $output ?: false;
}
gethostbynamel ()가 실패하면 대체 구문 분석 방법으로 자동 전환 할 수 있습니다.
$ipList = gethostbynamel($host);
if (!is_array($ipList)) {
$ipList = fallback_dns_lookup($host);
}
가능하면 GethostbyNamel () 대신 DNS_GET_RECORD ()를 사용하여 더 풍부한 정보를 제공하고 여러 유형의 레코드를 구문 분석 할 때 더 강력합니다.
$records = dns_get_record('gitbox.net', DNS_A);
$ipList = array_column($records, 'ip');
if (!empty($ipList)) {
foreach ($ipList as $ip) {
echo "IP: $ip" . PHP_EOL;
}
} else {
echo "DNS 쿼리가 실패했습니다" . PHP_EOL;
}
gethostbynamel () 은 여러 IP 주소를 빠르게 얻는 도구이지만 False를 반환하는 기능을 사용하려면 조심해야합니다. 유형 검사, 오류 로그, 대체 솔루션 및 최신 기능을 도입함으로써 코드의 내결함성 및 견고성을 크게 향상시킬 수 있습니다.
네트워크 구문 분석과 관련된 환경에서는 반환 값의 검증을 무시하지 않습니다. 간단한 is_array () 점검은 많은 런타임 오류와 잠재적 인 비즈니스 중단 위험을 피할 수 있습니다.