PHP: get_headers устанавливает временный stream_context - PullRequest
7 голосов
/ 08 декабря 2011

Полагаю, PHP get_headers не допускает контекст, поэтому мне нужно изменить контекст потока по умолчанию, чтобы получить только заголовок запроса.Это вызывает некоторые проблемы с другими запросами на странице.Я не могу понять, как сбросить контекст потока по умолчанию.Я пытаюсь что-то вроде:

$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, но я бы предпочел не для этого.Спасибо!

Ответы [ 3 ]

9 голосов
/ 22 мая 2012

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

5 голосов
/ 01 июля 2014

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

1 голос
/ 16 января 2014

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