PHP에서 GethostbyName 함수는 호스트 이름을 IPv4 주소로 해결하는 데 사용되는 일반적인 메소드입니다. 일반적인 사용법은 매우 간단합니다.
<?php
$ip = gethostbyname("example.com");
echo $ip;
?>
그러나 네트워크 환경이 점차 IPv6으로 마이그레이션함에 따라 많은 개발자가 다음에 대해 우려 할 것입니다. GethostbyName은 IPv6 환경에서 호환됩니까? 구문 분석 IPv6 주소를 지원합니까? 잠재적 인 문제가 있습니까? 그것을 해결하는 방법?
gethostbyname 기능은 기존 IPv4 설계를 기반으로합니다. 주요 기능은 호스트 이름에 해당하는 첫 번째 IPv4 주소 문자열을 반환하는 것입니다. 쿼리 호스트에 IPv4 주소가없고 IPv6 주소 만 존재하는 경우 gethostbyName은 유효한 IP를 정상적으로 반환하지 않을 수 있습니다.
간단히 말하면 :
IPv4 주소 해상도 만 지원됩니다.
IPv6 주소는 지원되지 않습니다.
호스트 이름이 IPv6 주소로만 구문 분석되면 반환 결과는 일반적으로 호스트 이름 자체입니다 (성공적으로 구문 분석되지 않았 음을 나타냅니다).
샘플 코드 :
<?php
$ip = gethostbyname("ipv6only.example.com");
echo $ip; // 가능한 출력“ipv6only.example.com”,대신에 IP 주소
?>
이것은 순수한 IPv6 환경에서 gethostbyname이 적용 가능성이 제한되어 있음을 보여줍니다.
IPv6 주소를 얻을 수 없습니다
GethostbyName은 IPv4 주소 만 반환하며 AAAA 레코드, 즉 IPv6 주소를 처리 할 수 없습니다.
호환성이 충분하지 않습니다 <br> 최신 네트워크에서는 점점 더 많은 서버가 IPv6 주소 만 사용하며 GethostbyName은 요구를 충족시킬 수 없습니다.
잠재적 오류 <br> 프로그램이 GethostbyName을 사용하여 유효한 IP를 얻는 경우 순수한 IPv6 호스트를 만나면 오류 또는 논리적 예외가 발생할 수 있습니다.
IPv6과 호환 되려면 PHP 7+에서 제공하는 DNS_GET_RECORD 또는 GETADDRINFO 기능과 같은보다 최신 기능을 사용하는 것이 좋습니다. Stream_Socket_Client 와 함께 IPv6을 지원할 수도 있습니다.
<?php
$hostname = "example.com";
// 모든 것을 얻으십시오 A 그리고 AAAA 기록
$records = dns_get_record($hostname, DNS_A + DNS_AAAA);
$ipv4s = [];
$ipv6s = [];
foreach ($records as $record) {
if ($record['type'] === 'A') {
$ipv4s[] = $record['ip'];
} elseif ($record['type'] === 'AAAA') {
$ipv6s[] = $record['ipv6'];
}
}
echo "IPv4 addresses:\n";
print_r($ipv4s);
echo "IPv6 addresses:\n";
print_r($ipv6s);
?>
이 방법은 호스트 이름에 해당하는 모든 IPv4 및 IPv6 주소를 한 번에 얻을 수 있습니다.
PHP 7.0은 나중에 소켓 확장에 socket_getAddrinfo를 도입하여보다 완전한 주소 정보를 반환하고 IPv4 및 IPv6을 지원할 수 있습니다.
<?php
$hostname = "example.com";
$results = socket_getaddrinfo($hostname, null);
foreach ($results as $result) {
$ip = $result['address'];
echo "IP: $ip\n";
}
?>
이 방법은 소켓 확장 설치에 의존하며 IPv6 주소를 지원합니다.
실제 네트워크 프로그램에서는 Stream_Socket_Client를 사용하여 IPv4 및 IPv6을 지원하는 연결을 시도 할 수도 있습니다.
<?php
$hostname = "example.com";
$port = 80;
$errno = 0;
$errstr = "";
$fp = @stream_socket_client("tcp://$hostname:$port", $errno, $errstr, 5);
if ($fp) {
$meta = stream_socket_get_name($fp, false);
echo "Connected via IP: $meta\n";
fclose($fp);
} else {
echo "Failed to connect: $errstr ($errno)\n";
}
?>
이 방법은 기본 네트워크 스택을 통해 적절한 IP (IPv4 또는 IPv6)를 자동으로 선택합니다.
GethostbyName은 IPv4 주소 만 구문 분석 할 수 있으며 IPv6을 지원하지 않습니다. 점차 구식 방법으로 간주되었습니다.
IPv6 환경에서 GethostbyName은 구문 분석이 실패하거나 잘못된 결과를 반환 할 수 있습니다.
DNS_GET_RECORD 또는 SOCKET_GETADDRINFO 와 같은 최신 방법을 사용하여 IPv4 및 IPv6 주소를 얻는 것이 좋습니다.
네트워크 연결의 경우 Code가 향후 네트워크 환경과 호환되도록 IPv6을 지원하는 기능 및 인터페이스를 사용하는 것이 좋습니다.