PHP: get_headers устанавливает временный stream_context

Я думаю, что get_headers PHP не допускает контекста, поэтому мне нужно изменить контекст потока по умолчанию, чтобы получить только 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, но я бы предпочел не для этого. Благодаря!

В результате я использовал функцию 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 (), но трекер ошибок отключен, поскольку я пишу это, поэтому я не могу проверить другие решения там.

У меня была аналогичная проблема, но я просто использовал функцию 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); 

Используя этот контекст, только заголовки будут $http_response_header и будут заполнять переменную PHP $http_response_header .

Вместо принятого ответа я сделал следующее, которое будет работать в 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