ネットワークプログラミングにPHPを使用する場合、 gethostbyname()関数は、ホスト名を対応するIPアドレスに解決するための一般的なツールです。ただし、場合によっては、 gethostbyname()の「未定義のホスト」を返すエラーに遭遇する可能性があります。通常、このエラーは、提供されたホスト名が解決できないため、プログラムが続行されないことを示しています。この記事では、この問題を解決するのに役立ついくつかの一般的な原因とソリューションを紹介します。
まず、最も一般的な理由は、提供するホスト名に誤りや誤った形式がある可能性があることです。 gethostbyname()関数には、有効なドメイン名またはホスト名が必要です。入力したホスト名が正しくない場合、またはドメイン名を解決できない場合、関数は「未定義のホスト」エラーを返します。
回避策:入力したホスト名またはドメイン名が正しいことを確認してください。ブラウザを介してホスト名にアクセスするか、 Pingなどのコマンドラインツールを使用して、ホストに到達可能かどうかを確認できます。
<span><span>ping example.com
</span></span>
gethostbyname()は、 DNS解像度に依存して、ホスト名をIPアドレスに変換します。システムのDNS構成が正しくない場合、またはDNSサーバーがドメイン名を解決できない場合、関数がエラーを返します。
回避策:PHPスクリプトで実行されているサーバーのDNS設定を確認します。 Linux Systemの/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を追加します。
Gethostbyname()は、DNSキャッシュの問題のためにドメイン名を解決できない場合がありますが、ドメイン名は有効です。
回避策:DNSキャッシュをクリアします。異なるオペレーティングシステムには、さまざまなクリーニング方法があります。たとえば、Linux Systemsでは、 NSCD (名前サービスキャッシュデーモン)を再起動できます。
<span><span>sudo systemctl restart nscd
</span></span>
Windowsシステムでは、次のコマンドを使用して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のプロキシ設定を確認して、正しく構成されていることを確認します。 PHPのプロキシ構成をini_set()を介して設定することも、システムレベルのプロキシ設定を介して正常にルーティングできることを確認することもできます。
<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()の使用を検討してください。上記の可能な原因を除外することにより、通常、エラーを解決することができます。