2011-09-27 20 views
6

サーバーへのリダイレクト情報があり、サーバーから応答が来たら、4XXで始まるコードがあれば例外をスローするようにHTTPコードをチェックします。そのためには、ヘッダからHTTPコードだけを取得する方法を知る必要があります。ここでもサーバーへのリダイレクトが関係しているので、私はカールが私にとって役に立たないことを恐れています。リダイレクト後のHTTP応答コード

これまでのところ、私はthis solutionを試しましたが、それは非常に遅く、私の場合はスクリプトのタイムアウトを作成します。私はスクリプトのタイムアウト期間を長くし、HTTPコードを取得するだけで長く待たずにいます。

ご意見ありがとうございます。

+2

カールがうまくリダイレ​​クトに従うことができます。あなたは、あなたの前提を恐れずにドキュメントでそれを読むことができます:http://php.net/manual/en/function.curl-setopt.php、 'CURLOPT_FOLLOWLOCATION'を探してください – Piskvor

+0

私はCURLOPT_FOLLOWLOCATIONオプションでカールを試みました。それは私のローカルサーバーにページをフェッチされ、サーバーから取得するページにユーザー名/パスワードを入力すると、サーバーはリダイレクトで混乱します。これを解決するには? –

答えて

6

ような何か:

$ch = curl_init(); 
    $httpcode = curl_getinfo ($ch, CURLINFO_HTTP_CODE); 

あなたはHttpEngineクラスを試してみてください。 これが役立つことを願っています。

- あなたが見つけ

EDIT

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_USERAGENT, $your_agent_variable); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_REFERER, $your_referer); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($ch, CURLOPT_TIMEOUT, 5); 
$output = curl_exec($ch); 
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
curl_close($ch); 

if ($httpcode ...) 
+0

申し訳ありません私はHttpEngineクラスを認識していません。あなたはそれについて私にいくつかの情報を提供できますか? –

+0

問題ありません。まあ、私はこのクラスをどこに覚えていません...だから私はここにこの1つをアップロードしました:http://pastebin.ca/2083612 あなたが助けを必要とするかどうか教えてください! –

+0

私はクラスファイルを調べましたが、ここでどのように役立つかは不明です。リダイレクトのためにCURLOPT_FOLLOWLOCATIONをtrueにするときは、カールを使用し、カールを使用します.GETメソッドはページ全体をフェッチしています。 –

0

ソリューションはよさそうです。サーバーがhttpヘッダーを時間通りに送信できない場合、問題は他のサーバーが壊れているか、非常に負荷が高いことです。

8
get_headers

あなたの方法と(もしあれば)最初の応答ラインを要求することは、リダイレクトのステータスコードを返しますより重要なことは、ファイル全体を転送しますGETリクエストを行います。

HEADリクエストのみが必要で、その後ヘッダーを解析しての最後のステータスコードを返します。これを実行するコード例を次に示し、それは$http_response_header代わりのget_headersを使用していますが、配列の形式は同じです:

$url = 'http://example.com/'; 

$options['http'] = array(
    'method' => "HEAD", 
    'ignore_errors' => 1, 
); 

$context = stream_context_create($options); 

$body = file_get_contents($url, NULL, $context); 

$responses = parse_http_response_header($http_response_header); 

$code = $responses[0]['status']['code']; // last status code 

echo "Status code (after all redirects): $code<br>\n"; 

$number = count($responses); 

$redirects = $number - 1; 

echo "Number of responses: $number ($redirects Redirect(s))<br>\n"; 

if ($redirects) 
{ 
    $from = $url; 

    foreach (array_reverse($responses) as $response) 
    { 
     if (!isset($response['fields']['LOCATION'])) 
      break; 
     $location = $response['fields']['LOCATION']; 
     $code = $response['status']['code']; 

     echo " * $from -- $code --> $location<br>\n"; 
     $from = $location; 
    } 
    echo "<br>\n"; 
} 

/** 
* parse_http_response_header 
* 
* @param array $headers as in $http_response_header 
* @return array status and headers grouped by response, last first 
*/ 
function parse_http_response_header(array $headers) 
{ 
    $responses = array(); 
    $buffer = NULL; 
    foreach ($headers as $header) 
    { 
     if ('HTTP/' === substr($header, 0, 5)) 
     { 
      // add buffer on top of all responses 
      if ($buffer) array_unshift($responses, $buffer); 
      $buffer = array(); 

      list($version, $code, $phrase) = explode(' ', $header, 3) + array('', FALSE, ''); 

      $buffer['status'] = array(
       'line' => $header, 
       'version' => $version, 
       'code' => (int) $code, 
       'phrase' => $phrase 
      ); 
      $fields = &$buffer['fields']; 
      $fields = array(); 
      continue; 
     } 
     list($name, $value) = explode(': ', $header, 2) + array('', ''); 
     // header-names are case insensitive 
     $name = strtoupper($name); 
     // values of multiple fields with the same name are normalized into 
     // a comma separated list (HTTP/1.0+1.1) 
     if (isset($fields[$name])) 
     { 
      $value = $fields[$name].','.$value; 
     } 
     $fields[$name] = $value; 
    } 
    unset($fields); // remove reference 
    array_unshift($responses, $buffer); 

    return $responses; 
} 

詳細については以下を参照してくださいどのようにすることができますHEAD first with PHP Streamsを、最後にはサンプルコードが含まれていますHEADリクエストをget_headersと一緒に実行してください。

関連:How can one check to see if a remote file exists using PHP?

+0

関連:[PHP:get_headersは一時的なstream_contextを設定しました](http://stackoverflow.com/questions/8429342/php-get-headers-set-temporary-stream-context) – hakre

関連する問題