8

PHP の get_headers はコンテキストを許可していないと思うので、リクエストの HEAD のみを取得するようにデフォルトのストリーム コンテキストを変更する必要があります。これにより、ページ上の他のリクエストでいくつかの問題が発生します。デフォルトのストリーム コンテキストをリセットする方法がわかりません。私は次のようなことを試みています:

$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 を使用することが提案されていることは知っていますが、これは使用したくありません。ありがとう!

4

4 に答える 4

10

最後に、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() の追加引数の機能要求があるようですが、これを書いている時点でバグ トラッカーが停止しているため、他の解決策を確認できません。

于 2012-05-22T12:39:34.727 に答える
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
于 2014-01-15T21:25:38.263 に答える