2011-12-08 12 views
6

PHPのget_headersはコンテキストを許可していないと思いますので、デフォルトのストリームコンテキストを変更してリクエストのHEADだけを取得する必要があります。これにより、ページ上の他のリクエストにいくつかの問題が発生します。私はデフォルトのストリームのコンテキストをリセットする方法を見つけることができないようです。誰もがこのための修正を知っていPHP:get_headersは一時的なstream_contextを設定します

$default = stream_context_get_default(); //Get default stream context so we can reset it 
stream_context_set_default(//Only fetch the HEAD 
     array(
    'http' => array(
     'method' => 'HEAD' 
    ) 
) 
); 
$headers = get_headers($url, 1); //Url can be whatever you want it to be 
//var_dump($headers); 
var_dump($default); 
stream_context_set_default($default); //This doesn't work as it expects an array and not a resource pointer 

:私のような何かをしようとしていますか?

私はそれがCurlを使うことが示唆されていることを知っていますが、私はむしろこれについてはないでしょう。ありがとう!

+0

get_headers不一致:http://stackoverflow.com/questions/12781795/get-headers-inconsistency – Baba

答えて

8

私はstream_get_meta_data()関数を使用してHTTPヘッダーを取得しました。

これは私がそれを実装する方法です:

次のように呼び出され
function get_headers_with_stream_context($url, $context, $assoc = 0) { 
    $fp = fopen($url, 'r', null, $context); 
    $metaData = stream_get_meta_data($fp); 
    fclose($fp); 

    $headerLines = $metaData['wrapper_data']; 

    if(!$assoc) return $headerLines; 

    $headers = array(); 
    foreach($headerLines as $line) { 
     if(strpos($line, 'HTTP') === 0) { 
      $headers[0] = $line; 
      continue; 
     } 

     list($key, $value) = explode(': ', $line); 
     $headers[$key] = $value; 
    } 

    return $headers; 
} 

$context = stream_context_create(array('http' => array('method' => 'HEAD'))); 
$headers = get_headers_with_stream_context($url, $context, 1); 

それはあなたが変更されていない標準stream_contextを残しながら、後にしている何を提供します。

http URL以外のものが渡された場合、この関数は失敗することに注意してください。

get_headers()の追加引数としてfeature requestがあるようですが、私がこれを書いているうちにバグトラッカーがダウンしているので、そこに他の解決策がないかどうかチェックすることはできません。

1

私はそれを完全にテストしていませんが、受け入れられた答えの代わりに、私はPHP 5.3以降で動作する以下を行いました。 (そこstream_context_get_params($context)もありますが、私はこれで十分だと思います。)

$stream_context_defaults = stream_context_get_options(stream_context_get_default()); 
stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
     ) 
    ) 
); 
for ($i = 1; $i <= 10; $i++) { 
    $headers = get_headers('http://www.example.org'); 
} 
stream_context_set_default($stream_context_defaults); // reset to defaults 
+1

これは必ずしも動作しません。 'stream_context_set_default() 'は空の$ stream_context_defaults配列で「リセット」することはできません。 – powtac

+1

これはどこかに記載されていますか?私はget_headersの引数の欠如を回避しようとしているので、これを投稿しました。新しいコンテキストを作成するのではなく、デフォルトを設定するのが賢明ではないかもしれないが、私はget_headersメソッドを再利用したいと思っている。 get_headersにfile_get_contentsのようなカスタムコンテキストを渡す機能があったらいいですね。 –

+0

ドキュメントではっきりと見たことがありません。それはテストによって明らかになった。 – powtac

4

私は同様の問題があったんだけど、代わりにカスタムストリームコンテキストでfile_get_contents機能を使用していました。

は、ここで私はそれを実装する方法は次のとおりです。

$options = array(
       'http' => array(
        'method' => 'HEAD', 
        'follow_location' => 0 
       ) 
      ); 

$context = stream_context_create($options); 

@file_get_contents($url, NULL, $context); 

var_dump($http_response_header); 

ヘッダーのみfile_get_contentsによってフェッチされると$http_response_header PHP変数に移入されます。このコンテキストを使用します。

関連する問題