簡體   English   中英

PHP:get_headers 設置臨時 stream_context

[英]PHP: get_headers set temporary stream_context

我猜 PHP 的 get_headers 不允許上下文,所以我必須更改默認的 stream 上下文以僅獲取請求的 HEAD。 這會導致頁面上的其他請求出現一些問題。 我似乎無法弄清楚如何重置默認的 stream 上下文。 我正在嘗試類似的東西:

$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,但我不想用這個。 謝謝!

我最終使用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()的附加參數的功能請求 ,但是當我寫這個時,bug跟蹤器已關閉,因此我無法檢查其他解決方案。

我有一個類似的問題,但我只是使用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變量。

而不是接受的答案,我做了以下,這將在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

從 PHP 7.1.0 開始, get_headers()現在接受上下文的第三個參數。

$context = stream_context_create(
    array(
        'http' => array('method' => 'HEAD')
    )
);

$headers = get_headers($url, true, $context);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM