anoncom blog
  • ホーム
  • About
KEEP IN TOUCH

接続先のサーバが応答するか判別する

2月22
2009
Leave a Comment Written by anon
このエントリーをはてなブックマークに追加
はてなブックマーク - 接続先のサーバが応答するか判別する
Share on LinkedIn

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:

  1. PHPでの簡易文字列の一致の判定
Posted in PHP, 開発 - Tagged PHP, TIPS
SHARE THIS Twitter Facebook Delicious StumbleUpon E-mail
« PHPでの簡易文字列の一致の判定
» 簡易クラスローダ

No Comments Yet

コメントを残す コメントをキャンセル

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

中の人

名前: あのん (anon) anon
詳細

 

2009年2月
日 月 火 水 木 金 土
« 1月   3月 »
1234567
891011121314
15161718192021
22232425262728

カテゴリー

  • Android
  • iPhone
  • Java
  • Linux
  • Mac
  • PC
  • PHP
  • Twitter
  • VOCALOID
  • イベント
  • サーバ
  • ソフトウェア
  • ネタ
  • ネット
  • モバイル
  • 無分類
  • 話題
  • 開発

アーカイブ

  • 2011年12月
  • 2011年9月
  • 2011年4月
  • 2011年3月
  • 2011年2月
  • 2011年1月
  • 2010年10月
  • 2010年8月
  • 2010年7月
  • 2010年6月
  • 2010年5月
  • 2010年3月
  • 2010年1月
  • 2009年11月
  • 2009年10月
  • 2009年8月
  • 2009年6月
  • 2009年4月
  • 2009年3月
  • 2009年2月
  • 2009年1月
  • 2008年12月
  • 2008年11月
  • 2008年7月
  • 2008年4月

最近の投稿

  • Galaxy Nexusを購入しました
  • さくらのVPSを使いながら行ったウェブサイトの3つの負荷対策
  • PSNの障害と個人情報漏洩について
  • ミクパ♪(初音ミク ライブパーティ 2011)に行ってきたよ
  • FirefoxからChromeに乗り換えてみた

最近のコメント

  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に 2011年2月のこれだけ読めば分かる Web 制作者向け情報まとめ | ウェブル より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に 2/1 (火) 前田敦子 豊胸疑惑でネット炎上(画像) | マスコミの気になるニュースをまとめ読み! より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に クロネコ より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に eamcet*[SEO対策調査自動更新ブログ] | とあるTwitterユーザー、商標権侵害を理由にTwitterアカウント名の変更を求められる より
  • Twitterアカウント名が商標権侵害で訴えられそうになった話 に 心は萌え より

Tweet on Twitter

EvoLve theme by Theme4Press  •  Powered by WordPress anoncom blog