현재 위치: > 최신 기사 목록> PHP gethostbyname 기능이 IPv6 환경에서 호환됩니까? 어떤 문제와 솔루션이 존재합니까?

PHP gethostbyname 기능이 IPv6 환경에서 호환됩니까? 어떤 문제와 솔루션이 존재합니까?

gitbox 2025-06-10

PHP에서 GethostbyName 함수는 호스트 이름을 IPv4 주소로 해결하는 데 사용되는 일반적인 메소드입니다. 일반적인 사용법은 매우 간단합니다.

 <?php
$ip = gethostbyname("example.com");
echo $ip;
?>

그러나 네트워크 환경이 점차 IPv6으로 마이그레이션함에 따라 많은 개발자가 다음에 대해 우려 할 것입니다. GethostbyName은 IPv6 환경에서 호환됩니까? 구문 분석 IPv6 주소를 지원합니까? 잠재적 인 문제가 있습니까? 그것을 해결하는 방법?

GethostbyName의 작업 메커니즘은 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이 적용 가능성이 제한되어 있음을 보여줍니다.

기존 문제

  1. IPv6 주소를 얻을 수 없습니다
    GethostbyName은 IPv4 주소 만 반환하며 AAAA 레코드, 즉 IPv6 주소를 처리 할 수 ​​없습니다.

  2. 호환성이 충분하지 않습니다 <br> 최신 네트워크에서는 점점 더 많은 서버가 IPv6 주소 만 사용하며 GethostbyName은 요구를 충족시킬 수 없습니다.

  3. 잠재적 오류 <br> 프로그램이 GethostbyName을 사용하여 유효한 IP를 얻는 경우 순수한 IPv6 호스트를 만나면 오류 또는 논리적 예외가 발생할 수 있습니다.

해결책

IPv6과 호환 되려면 PHP 7+에서 제공하는 DNS_GET_RECORD 또는 GETADDRINFO 기능과 같은보다 최신 기능을 사용하는 것이 좋습니다. Stream_Socket_Client 와 함께 IPv6을 지원할 수도 있습니다.

방법 1 : DNS_GET_RECORD를 사용하여 A 및 AAAA 레코드를 얻습니다.

 <?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 주소를 한 번에 얻을 수 있습니다.

방법 2 : getAddrinfo 함수 사용 (PHP 7.0+)

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 주소를 지원합니다.

방법 3 : Stream_Socket_Client 와 함께 연결을 테스트하십시오

실제 네트워크 프로그램에서는 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을 지원하는 기능 및 인터페이스를 사용하는 것이 좋습니다.