PHPのプログラム中で、別のサーバに接続する際、タイムアウトを適切に設定していない場合や、データ取得時にタイムアウトを設定できない場合もあるかと思います。そんなときに、まず先に接続先が生存しているかを確認しておくと、エラー処理の判定もしやすくなると思います。
そこで、接続を開始する前に事前に接続先のサーバに接続を試行してみます。
※PHP5.0以前の環境ではこのまま実行すると、throwの部分で構文エラーになる可能性があります。その場合はバージョン判定部分とthrow new Exceptionの部分を取り除いてください。
[php]
/**
* $hostname が接続先として接続応答出来る状態かを確認します。
*
* @access public static
* @param string $hostname 接続先ホスト名またはIP
* @param int $port 接続先ポート番号
* @param int $timeout タイムアウトを指定する(秒)
* @return boolean
*/
function isAliveHost($hostname, $port = 80, $timeout = 5)
{
if(empty($hostname)){
if(version_compare(PHP_VERSION, '5.0.0', '< ')){
trigger_error('Hostname is empty.', E_USER_ERROR);
}else{
throw new Exception('Hostname is empty.');
}
}
// port番号指定がint型以外、あるいはintの範囲外である場合はfalseを返します。
if(!is_int($port)){
if(version_compare(PHP_VERSION, '5.0.0', '<')){
trigger_error('Invalid port number: ' . $port, E_USER_ERROR);
}else{
throw new Exception('Invalid port number: ' . $port);
}
}
// port番号が65535を超える場合は、不正な値とみなし、falseを返します。
if($port < 0 || $port > 65535){
if(version_compare(PHP_VERSION, '5.0.0', '< ')){
trigger_error('Invalid range of port number: ' . $port, E_USER_ERROR); // for PHP4
}else{
throw new Exception('Invalid range of port number: ' . $port);
}
}
$fp = fsockopen($hostname, $port, $errno, $errmsg, $timeout);
if(!$fp){
error_log('could not connect to ' . $hostname . ':' . $port . ', ' . $errmsg);
return false;
}
fclose($fp);
return true;
}
[/php]
使い方は以下の通り
[php]
< ?php
if(isAliveHost('www.google.co.jp', 80)){
$content = file_get_contents('http://www.google.co.jp/');
}else{
error_log('failed to get index page on www.google.co.jp.');
}
[/php]
[php]
< ?php
if(!isAliveHost('mfsmax.docomo.ne.jp', 25)){
error_log('failed to connect to port 25 on docomo.ne.jp.');
}
[/php]
Related posts:


最近のコメント