【PHP8.x】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)
$hostname = "example.com";
$ipAddress = gethostbyname($hostname);
引数(parameters)
string $hostname
- string $hostname: IPアドレスに変換したいホスト名またはドメイン名
戻り値(return)
string
指定されたホスト名に対応するIPv4アドレスの文字列を返します。ホスト名が見つからない場合はfalseを返します。
サンプルコード
PHPでgethostbynameとタイムアウト処理
<?php
/**
* ホスト名からIPアドレスを取得し、タイムアウト処理を追加したサンプルコード
*
* @param string $hostname ホスト名
* @param int $timeout タイムアウト秒数
* @return string|false IPアドレス(成功時)、false(失敗時)
*/
function getHostByNameWithTimeout(string $hostname, int $timeout = 5): string|false
{
// タイムアウトを設定
stream_context_set_default(
[
'socket' => [
'tcp_connect_timeout' => $timeout,
],
]
);
// ホスト名からIPアドレスを取得
$ipAddress = gethostbyname($hostname);
// エラーチェック
if ($ipAddress === $hostname) {
// gethostbyname は解決できない場合、ホスト名をそのまま返す
return false;
}
// IPアドレスを返す
return $ipAddress;
}
// 例:google.com のIPアドレスを取得
$hostname = 'google.com';
$ipAddress = getHostByNameWithTimeout($hostname);
if ($ipAddress !== false) {
echo "{$hostname} のIPアドレス: {$ipAddress}\n";
} else {
echo "{$hostname} のIPアドレスを取得できませんでした。\n";
}
// 例:存在しないホスト名のIPアドレスを取得(タイムアウト処理を確認)
$hostname = 'invalid.example.com';
$ipAddress = getHostByNameWithTimeout($hostname, 1); // タイムアウトを1秒に設定
if ($ipAddress !== false) {
echo "{$hostname} のIPアドレス: {$ipAddress}\n";
} else {
echo "{$hostname} のIPアドレスを取得できませんでした。\n";
}
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
関数に渡すことは避けるべきです。入力値を検証し、不正なホスト名が渡されないように対策を行うことが重要です。