2012-01-12 13 views
1

私はまだかなり新しいphpですが、以下のコードがサイトが上がっているか下がっているかを教えてもらえますか?php get_headersサイトが稼働しているかどうかを確認する良い方法はありますか?

ありがとうございます。

$siteHeader = @get_headers($url , 1); 
if ($siteHeader > 1) { 
    $siteUp = true; 
} else { 
    $siteUp = false; 
} 
+0

get_headers矛盾:http://stackoverflow.com/questions/12781795/get-headers-inconsistency – Baba

答えて

1

更新:より多くの私はそれについて考える、あまり細かいことが見えます。振り返ってみるとわかりやすい私の最初の答えを広げた。

basicですが、応答があるかどうかを確認するのではなく、HTTP応答コードもチェックしてください。コードが現時点では、相手側で聞いている人がいることがわかります。これは、ほとんどの人が「サイトが上がっている」と考えているから遠いところです。ここで

は簡単にHTTPレスポンスコードを分離(または要求が失敗した場合falseを取得)する方法は次のとおりです。

$headers = get_headers('http://www.google.com'); 
$code = $headers ? intval(end(explode(' ', $headers[0], 2))) : false; 

それとは別に、リダイレクトの問題でもあります:あなたがリダイレクトを見れば、あなたは何をしますか?照会したサーバーはOKかもしれませんが、リダイレクト先のサーバーがダウンしている可能性があります。誰かがブラウザにURLを入力した場合、リダイレクトされて最終的にタイムアウトしますが、ワンステップテストではすべてがOKだと言います。リダイレクトループがある場合はどうなりますか?ブラウザはこれを検出して最終的にタイムアウトしますが、同じようにコードを書く必要があります。

このように、cURLはこのすべてを透過的に処理するため、最終的に唯一の確実なソリューションのように見えます。

+0

get_headers矛盾します。http: //stackoverflow.com/questions/12781795/get-headers-inconsistency ..それは最良の選択肢ではないかもしれません..今度はカールで同様のテストを実行しています – Baba

1

あなたの場合によりますが、特にあなたのURLがユーザーによって提出された場合、私はそのようなものに行きます。

//returns true, if domain is availible, false if not 
function isDomainAvailible($domain) 
{ 
    //check if URL is valid 
    if(!filter_var($domain, FILTER_VALIDATE_URL)){ 
      return false; 
    } 

    $agent = "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"; 
    $ch = curl_init(); 
    curl_setopt ($ch, CURLOPT_URL, $url); 
    curl_setopt ($ch, CURLOPT_USERAGENT, $agent); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt ($ch,CURLOPT_VERBOSE, FALSE); 
    curl_setopt ($ch, CURLOPT_TIMEOUT, 10); 
    curl_setopt ($ch,CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt ($ch,CURLOPT_SSLVERSION, 3); 
    curl_setopt ($ch,CURLOPT_SSL_VERIFYHOST, FALSE); 
    $page=curl_exec($ch); 
    //echo curl_error($ch); 
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 
    if ($httpcode >= 200 && $httpcode < 300) 
    return true; 
    else 
    return false; 
} 

ほとんどの場合、一部のサーバーはユーザーエージェントを送信しないと応答しません。

私はちょうど私のthatsカール使用していますが、
+0

"主にあなたがユーザーエージェント。" - それは実際には本当ですか?たとえそれがあったとしても、カールはこのために過度のものかもしれません。私はちょうどPHPソケットを使って解決策を書くだろうが、とにかくこれで十分だと思う。 –

+0

@JohnChadwick yestです。安全な手段として:) –

2

function check($url,$ignore = ''){ 
$agent = "Mozilla/4.0 (B*U*S)"; 
$ch = curl_init(); 
curl_setopt($ch,CURLOPT_URL,$url); 
curl_setopt($ch,CURLOPT_USERAGENT,$agent); 

curl_setopt($ch,CURLOPT_VERBOSE,false); 
curl_setopt($ch,CURLOPT_TIMEOUT,45); 
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,45); 

curl_setopt($ch,CURLOPT_HEADER,true); 
curl_setopt($ch,CURLOPT_NOBODY,true); 

curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
curl_setopt($ch,CURLOPT_FOLLOWLOCATION,true); 
curl_setopt($ch,CURLOPT_MAXREDIRS,5); //follow up to 10 redirections - avoids loops 


curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,0); //fix for certificate issue 
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,0); //fix for certificate issue 


$page = curl_exec($ch); 
$err = curl_error($ch); 
$httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE); 
curl_close($ch); 

$codes = array(
    0=>'Domain Not Found',100=>'Continue',101=>'Switching Protocols',200=>'OK',201=>'Created',202=>'Accepted',203=>'Non-Authoritative Information',204=>'No Content',205=>'Reset Content',206=>'Partial Content',300=>'Multiple Choices',301=>'Moved Permanently',302=>'Found',303=>'See Other',304=>'Not Modified',305=>'Use Proxy',307=>'Temporary Redirect',400=>'Bad Request',401=>'Unauthorized',402=>'Payment Required',403=>'Forbidden',404=>'Not Found',405=>'Method Not Allowed',406=>'Not Acceptable',407=>'Proxy Authentication Required',408=>'Request Timeout',409=>'Conflict',410=>'Gone',411=>'Length Required',412=>'Precondition Failed',413=>'Request Entity Too Large',414=>'Request-URI Too Long',415=>'Unsupported Media Type',416=>'Requested Range Not Satisfiable',417=>'Expectation Failed',500=>'Internal Server Error',501=>'Not Implemented',502=>'Bad Gateway',503=>'Service Unavailable',504=>'Gateway Timeout',505=>'HTTP Version Not Supported'); 

$httpcode_out = 'http: '.$httpcode.' ('.$codes[$httpcode].')'; 
$err = 'curl error: '.$err; 

$out = array(
    $url,$httpcode_out,$err); 

if($httpcode>=200&&$httpcode<307){//good 
    return array('Work',$out); 
}else{//BAD 
    return array('Fail',$out); 
} 

}

関連する問題