2011-12-08 72 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以外的任何內容,此函數將失敗。

似乎有一個feature request爲get_headers()的額外參數,但錯誤跟蹤器已關閉,因爲我正在寫這個,所以我無法檢查其他解決方案。

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變量。