네트워크 프로그래밍에 PHP를 사용할 때 GethostByName () 함수는 호스트 이름을 해당 IP 주소로 해결하기위한 일반적인 도구입니다. 그러나 경우에 따라 "정의되지 않은 호스트"를 반환하는 gethostbyName () 의 오류가 발생할 수 있습니다. 이 오류는 일반적으로 제공된 호스트 이름을 해결할 수 없으므로 프로그램이 진행되지 않음을 나타냅니다. 이 기사는이 문제를 해결하는 데 도움이되는 몇 가지 일반적인 원인과 솔루션을 소개합니다.
첫째, 가장 일반적인 이유는 귀하가 제공하는 호스트 이름에 철자가 잘못되거나 잘못된 형식을 가질 수 있기 때문입니다. gethostbyName () 함수에는 유효한 도메인 이름 또는 호스트 이름이 필요합니다. 입력 한 호스트 이름이 올바르지 않거나 도메인 이름을 해결할 수없는 경우 함수는 "정의되지 않은 호스트"오류를 반환합니다.
해결 방법 : 입력 한 호스트 이름 또는 도메인 이름이 올바른지 확인하십시오. 브라우저를 통해 호스트 이름에 액세스하거나 Ping 과 같은 명령 줄 도구를 사용하여 호스트가 도달 할 수 있는지 확인할 수 있습니다.
<span><span>ping example.com
</span></span>
gethostbyName ()은 DNS 해상도에 의존하여 호스트 이름을 IP 주소로 변환합니다. 시스템의 DNS 구성이 올바르지 않거나 DNS 서버가 도메인 이름을 해결할 수없는 경우 기능이 오류를 반환하게됩니다.
해결 방법 : PHP 스크립트에서 실행되는 서버의 DNS 설정을 확인하십시오. Linux 시스템에서 /etc/resolv.conf 파일을 확인하여 DNS 서버가 올바르게 구성되었는지 확인할 수 있습니다. 예를 들어:
<span><span><span class="hljs-built_in">cat</span></span><span> /etc/resolv.conf
</span></span>
파일에 유효한 DNS 서버 주소가 있는지 확인하십시오. 그렇지 않은 경우 Google (8.8.8.8 및 8.8.4.4)과 같은 공개 DNS를 추가하십시오.
때로는 도메인 이름이 유효하지만 DNS 캐싱 문제로 인해 gethostbyName () 이 도메인 이름을 해결할 수 없습니다.
해결 방법 : DNS 캐시를 지우십시오. 운영 체제마다 다른 청소 방법이 있습니다. 예를 들어 Linux Systems에서는 NSCD (Name Service Cache 데몬)를 다시 시작할 수 있습니다.
<span><span>sudo systemctl restart nscd
</span></span>
Windows Systems에서는 다음 명령을 사용하여 DNS 캐시를 지울 수 있습니다.
<span><span>ipconfig /flushdns
</span></span>
gethostbyname () 은 간단한 기능이지만 몇 가지 제한 사항이 있습니다. 예를 들어, 항상 첫 번째 구문 분석 IP 주소를 반환합니다. 구문 분석이 실패하면 더 많은 오류 정보를 제공하는 대신 원래 호스트 이름을 반환합니다. 따라서 사용할 때주의해야합니다.
해결 방법 : GetAddRinfo ()를 사용해 볼 수 있습니다. 이는 문제를 진단하는 데 도움이되는 자세한 내용을 제공 할 수있는보다 강력한 대안입니다.
<span><span><span class="hljs-variable">$hostname</span></span><span> = </span><span><span class="hljs-string">'example.com'</span></span><span>;
</span><span><span class="hljs-variable">$info</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getaddrinfo</span></span><span>(</span><span><span class="hljs-variable">$hostname</span></span><span>, </span><span><span class="hljs-literal">null</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span>) {
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$info</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$entry</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'IP주소: '</span></span><span> . </span><span><span class="hljs-variable">$entry</span></span><span>[</span><span><span class="hljs-string">'host'</span></span><span>] . PHP_EOL;
}
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'호스트 이름을 해결하지 못했습니다'</span></span><span> . PHP_EOL;
}
</span></span>
getAddrinfo ()는 복잡한 네트워크 요청에 적합한 여러 IP 주소가 포함 된 다양한 정보를 반환합니다.
프록시 서버를 통해 네트워크에 액세스하는 환경에서 PHP 스크립트가 실행중인 경우 프록시 설정이 gethostbyName () 함수의 일반적인 작업을 방해 할 수 있습니다. 프록시 서버는 DNS 요청을 전달하지 않아 호스트 이름을 해결할 수 없습니다.
해결 방법 : PHP의 프록시 설정을 확인하여 올바르게 구성되었는지 확인하십시오. ini_set () 을 통해 PHP의 프록시 구성을 설정하거나 시스템 수준 프록시 설정을 통해 요청을 정상적으로 라우팅 할 수 있는지 확인할 수 있습니다.
<span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'http.proxy_host'</span></span><span>, </span><span><span class="hljs-string">'proxy.example.com'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">ini_set</span></span><span>(</span><span><span class="hljs-string">'http.proxy_port'</span></span><span>, </span><span><span class="hljs-string">'8080'</span></span><span>);
</span></span>
경우에 따라 방화벽은 PHP 스크립트가 DNS 서비스에 액세스하는 것을 방지 할 수 있습니다. PHP가 외부 DNS 서버에 액세스 할 수 있도록 네트워크 연결 및 방화벽 설정을 확인하십시오.
해결 방법 : DNS가 요청을 해결할 수 있도록 서버의 방화벽 설정을 확인하십시오. iPtables 명령을 사용하여 Linux 시스템에서 방화벽 규칙을 보거나 수정할 수 있습니다.
<span><span>sudo iptables -L
</span></span>
gethostbyname () 은 간단하고 실용적인 기능이지만 그 한계는 일부 오류를 유발할 수 있습니다. "정의되지 않은 호스트"오류가 발생하면 먼저 입력 된 호스트 이름이 올바른지 확인한 다음 DNS 구성, 캐시 문제 및 네트워크 연결 문제를 확인하십시오. 더 복잡한 기능이 필요한 경우 대신 getAddrinfo ()를 사용해보십시오. 위에서 언급 한 가능한 원인을 제외하면 일반적으로 오류를 해결할 수 있습니다.