PHP: get_headers устанавливает временный stream_context
Я думаю, PHP get_headers не разрешает контекст, поэтому мне нужно изменить контекст потока по умолчанию, чтобы получить только HEAD запроса. Это вызывает некоторые проблемы с другими запросами на странице. Я не могу понять, как reset контекст потока по умолчанию. Я пытаюсь что-то вроде:
$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, но я бы предпочел не для этого. Спасибо!
Ответы
Ответ 1
В результате я использовал функцию 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 неизменным.
Обратите внимание, что эта функция завершится с ошибкой, если передано что-либо, кроме URL-адреса http.
Кажется, есть запрос функции для дополнительного аргумента для get_headers(), но трекер ошибок отключен, поскольку я пишу это, так что я могу" t проверить другие решения там.
Ответ 2
У меня была аналогичная проблема, но я просто использовал функцию 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
и заполнят переменную PHP $http_response_header
.
Ответ 3
Вместо принятого ответа я сделал следующее, которое будет работать в 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