【PHP8.x】gethostbyname関数の使い方
gethostbyname関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
gethostbyname関数は、指定されたホスト名に対応するIPv4アドレスを取得する関数です。インターネット上のコンピューターは、人間が覚えやすい「ホスト名」(例えば www.example.com)と、コンピューターが実際に通信に使う数値の住所である「IPv4アドレス」(例えば 192.0.2.1)の両方を持っています。この関数は、与えられたホスト名からそのホストのIPv4アドレスを調べる、いわば「インターネット上の住所変換」を行う役割を果たします。
例えば、ウェブサイトにアクセスする際や、特定のサーバーに接続するプログラムを作成する際などに、ホスト名からIPアドレスを知る必要がある場合に利用されます。gethostbyname("www.php.net") のようにホスト名を引数として渡すと、PHPの公式ウェブサイトが稼働しているサーバーのIPv4アドレスが文字列として返されます。
この関数は、ネットワークを通じてDNS(Domain Name System)サーバーに問い合わせを行い、ホスト名の解決を試みます。解決に成功した場合は対応するIPv4アドレスの文字列が戻り値となりますが、もし指定されたホスト名が見つからない、またはDNSサーバーへの問い合わせに失敗した場合は、引数として渡されたホスト名そのものが戻り値として返されます。そのため、関数が正常に動作したかを確認するには、戻り値が入力したホスト名と異なるかどうかをチェックすることが重要です。この関数はIPv4アドレスのみを扱い、IPv6アドレスは対象外である点にご留意ください。
構文(syntax)
1$hostname = "example.com"; 2$ipAddress = gethostbyname($hostname);
引数(parameters)
string $hostname
- string $hostname: IPアドレスに変換したいホスト名またはドメイン名
戻り値(return)
string
指定されたホスト名に対応するIPv4アドレスの文字列を返します。ホスト名が見つからない場合はfalseを返します。
サンプルコード
PHP gethostbyname でホスト名から IPv4 アドレスを取得する
1<?php 2 3/** 4 * ホスト名から IPv4 アドレスを取得するサンプルコード。 5 * IPv6 アドレスは gethostbyname 関数では取得できないため、 6 * より高機能な関数を使用する必要がある。 7 * 8 * @param string $hostname ホスト名 9 * @return string|false IPv4 アドレス (成功時) または false (失敗時) 10 */ 11function get_ipv4_address(string $hostname): string|false 12{ 13 $ip_address = gethostbyname($hostname); 14 15 // gethostbyname は、ホスト名が存在しない場合、ホスト名をそのまま返すことがある。 16 if ($ip_address === $hostname) { 17 return false; // ホスト名解決に失敗 18 } 19 20 return $ip_address; 21} 22 23// 例: google.com の IPv4 アドレスを取得 24$hostname = 'google.com'; 25$ipv4_address = get_ipv4_address($hostname); 26 27if ($ipv4_address !== false) { 28 echo "{$hostname} の IPv4 アドレス: {$ipv4_address}\n"; 29} else { 30 echo "{$hostname} の IPv4 アドレスを取得できませんでした。\n"; 31} 32 33// IPv6 アドレスを取得するには、dns_get_record 関数などを使用する必要がある。 34// 例: 35// $records = dns_get_record('google.com', DNS_AAAA); 36// if (!empty($records)) { 37// echo "IPv6 アドレス: " . $records[0]['ipv6'] . "\n"; 38// }
gethostbyname 関数は、指定されたホスト名に対応する IPv4 アドレスを文字列で返す PHP の関数です。引数には、アドレスを調べたいホスト名を文字列で指定します。例えば、'google.com' のように指定します。関数が成功すると、ホスト名に対応する IPv4 アドレスが返されます。もしホスト名が見つからないなどの理由で解決に失敗した場合、この関数は引数で与えられたホスト名をそのまま返すことがあります。サンプルコードでは、この特性を利用して、gethostbyname の戻り値が入力と同じかどうかをチェックし、解決に失敗したかどうかを判断しています。
サンプルコードの get_ipv4_address 関数は、gethostbyname 関数をラップし、ホスト名解決の成否をより明確に判断できるようにしています。この関数は、ホスト名解決に成功した場合は IPv4 アドレスを返し、失敗した場合は false を返します。
gethostbyname 関数は IPv4 アドレスしか取得できないことに注意が必要です。IPv6 アドレスを取得したい場合は、dns_get_record 関数を使用する必要があります。サンプルコード内にも、dns_get_record 関数を使った IPv6 アドレス取得の例がコメントとして記載されています。この関数を使うことで、A レコード(IPv4 アドレス)だけでなく、AAAA レコード(IPv6 アドレス)など、さまざまな DNS レコードを取得できます。
gethostbyname関数は、IPv4アドレスのみを返します。IPv6アドレスを取得するには、dns_get_record関数を代わりに利用する必要があります。gethostbynameは、ホスト名解決に失敗した場合、引数に指定したホスト名をそのまま返すことがあります。そのため、戻り値がホスト名と一致するかどうかをチェックし、エラー処理を行うようにしてください。この関数はDNS情報を参照するため、ネットワーク環境によっては結果が異なる場合があります。セキュリティ上の理由から、ユーザーからの入力値を直接gethostbynameに渡すことは避けてください。
PHPでホスト名からIPアドレスを取得する
1<?php 2 3/** 4 * ホスト名からIPアドレスを取得するサンプルコード 5 */ 6function getIpAddressByHostname(string $hostname): string|false 7{ 8 // gethostbyname関数を使ってIPアドレスを取得する 9 $ipAddress = gethostbyname($hostname); 10 11 // IPアドレスがホスト名と同じ場合は解決に失敗したと判断する 12 if ($ipAddress === $hostname) { 13 return false; // 解決失敗 14 } 15 16 return $ipAddress; // IPアドレスを返す 17} 18 19// 例:google.com のIPアドレスを取得する 20$hostname = 'google.com'; 21$ipAddress = getIpAddressByHostname($hostname); 22 23if ($ipAddress !== false) { 24 echo "ホスト名: " . $hostname . "\n"; 25 echo "IPアドレス: " . $ipAddress . "\n"; 26} else { 27 echo "ホスト名 " . $hostname . " のIPアドレス解決に失敗しました。\n"; 28} 29 30?>
このPHPサンプルコードは、gethostbyname関数を使って、与えられたホスト名に対応するIPアドレスを取得する方法を示しています。gethostbyname関数は、引数としてホスト名(文字列)を受け取り、そのホスト名に関連付けられたIPアドレスを文字列として返します。もしIPアドレスの解決に失敗した場合、関数はホスト名そのものを返します。
サンプルコードでは、getIpAddressByHostnameという関数を定義し、この中でgethostbyname関数を呼び出しています。getIpAddressByHostname関数は、引数としてホスト名を受け取り、IPアドレスの解決を試みます。解決に成功した場合はIPアドレスを返し、失敗した場合はfalseを返します。
IPアドレスの解決が成功したかどうかは、gethostbyname関数の戻り値が入力されたホスト名と一致するかどうかで判断しています。一致する場合は解決失敗とみなし、falseを返します。
最後に、例としてgoogle.comのIPアドレスを取得し、結果を表示しています。IPアドレスの解決に成功した場合は、ホスト名とIPアドレスを表示し、失敗した場合はエラーメッセージを表示します。このコードを実行することで、gethostbyname関数の基本的な使い方と、IPアドレス解決の成功/失敗の判定方法を理解することができます。システムエンジニアを目指す方は、このコードを参考に、DNSサーバーの仕組みやネットワークプログラミングについて学習を深めていくと良いでしょう。
gethostbyname関数は、ホスト名からIPアドレスを調べますが、名前解決に失敗した場合、引数で与えたホスト名そのものを返すことがあります。サンプルコードでは、この点をチェックし、解決失敗として処理しています。IPアドレスがホスト名と同じ文字列だった場合は、エラー処理を行うようにしましょう。また、この関数はネットワークに接続できない環境では動作しません。セキュリティ上の理由から、外部からのホスト名を受け取る場合は、入力値の検証を必ず行ってください。不正なホスト名を渡されると、意図しない動作を引き起こす可能性があります。
PHPでgethostbynameとタイムアウト処理
1<?php 2 3/** 4 * ホスト名からIPアドレスを取得し、タイムアウト処理を追加したサンプルコード 5 * 6 * @param string $hostname ホスト名 7 * @param int $timeout タイムアウト秒数 8 * @return string|false IPアドレス(成功時)、false(失敗時) 9 */ 10function getHostByNameWithTimeout(string $hostname, int $timeout = 5): string|false 11{ 12 // タイムアウトを設定 13 stream_context_set_default( 14 [ 15 'socket' => [ 16 'tcp_connect_timeout' => $timeout, 17 ], 18 ] 19 ); 20 21 // ホスト名からIPアドレスを取得 22 $ipAddress = gethostbyname($hostname); 23 24 // エラーチェック 25 if ($ipAddress === $hostname) { 26 // gethostbyname は解決できない場合、ホスト名をそのまま返す 27 return false; 28 } 29 30 // IPアドレスを返す 31 return $ipAddress; 32} 33 34// 例:google.com のIPアドレスを取得 35$hostname = 'google.com'; 36$ipAddress = getHostByNameWithTimeout($hostname); 37 38if ($ipAddress !== false) { 39 echo "{$hostname} のIPアドレス: {$ipAddress}\n"; 40} else { 41 echo "{$hostname} のIPアドレスを取得できませんでした。\n"; 42} 43 44// 例:存在しないホスト名のIPアドレスを取得(タイムアウト処理を確認) 45$hostname = 'invalid.example.com'; 46$ipAddress = getHostByNameWithTimeout($hostname, 1); // タイムアウトを1秒に設定 47 48if ($ipAddress !== false) { 49 echo "{$hostname} のIPアドレス: {$ipAddress}\n"; 50} else { 51 echo "{$hostname} のIPアドレスを取得できませんでした。\n"; 52}
PHPのgethostbyname関数は、指定されたホスト名に対応するIPアドレスを検索する関数です。引数には、IPアドレスを調べたいホスト名を文字列で渡します。戻り値は、ホスト名に対応するIPアドレスを文字列で返します。もし、ホスト名が見つからない場合は、引数に指定したホスト名そのものが返されます。
このサンプルコードでは、gethostbyname関数にタイムアウト処理を追加したgetHostByNameWithTimeout関数を定義しています。この関数は、指定されたホスト名からIPアドレスを取得する際に、一定時間で処理を打ち切るようにします。タイムアウト時間はオプションの引数で指定でき、デフォルトは5秒です。
タイムアウト処理は、stream_context_set_default関数を使ってソケットの接続タイムアウトを設定することで実現しています。gethostbyname関数を実行後、戻り値が入力ホスト名と同じであるかをチェックしています。同じ場合、IPアドレスの取得に失敗したとみなし、falseを返します。IPアドレスの取得に成功した場合は、取得したIPアドレスを返します。
サンプルコードでは、google.comとinvalid.example.comという2つのホスト名を使ってgetHostByNameWithTimeout関数の動作を確認しています。invalid.example.comは存在しないホスト名なので、タイムアウト処理が働き、IPアドレスの取得に失敗することが期待されます。このように、gethostbyname関数を直接使うだけでなく、タイムアウト処理を追加することで、より安定したネットワーク処理を行うことができます。
gethostbyname関数は、ホスト名が解決できない場合にホスト名そのものを返すため、戻り値がホスト名と一致するかどうかでエラー判定を行う必要があります。タイムアウト処理は、stream_context_set_default関数でソケットのオプションを設定することで実現しています。タイムアウト時間を短く設定しすぎると、名前解決が完了する前にタイムアウトしてしまう可能性があるため、注意が必要です。また、gethostbyname関数は、DNSサーバへの問い合わせを行うため、ネットワーク環境によっては処理時間が長くなることがあります。セキュリティの観点から、外部からの入力値を直接gethostbyname関数に渡すことは避けるべきです。入力値を検証し、不正なホスト名が渡されないように対策を行うことが重要です。