PHP:get_headers设置临时stream_context

Sen*_*lez 7 php header stream head http-headers

我猜PHP的get_headers不允许上下文,因此我必须更改默认流上下文以仅获取请求的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
Run Code Online (Sandbox Code Playgroud)

有谁知道解决这个问题?

我知道有人建议使用Curl,但我不愿意这个.谢谢!

Pet*_*ter 9

我最终使用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;
}
Run Code Online (Sandbox Code Playgroud)

这样称呼,

$context = stream_context_create(array('http' => array('method' => 'HEAD')));
$headers = get_headers_with_stream_context($url, $context, 1);
Run Code Online (Sandbox Code Playgroud)

它为您提供了未经修改的标准stream_context时所追求的内容.

请注意,如果传递除http url以外的任何内容,此函数将失败.

似乎有一个针对get_headers()的附加参数的功能请求,但是当我写这个时,bug跟踪器已关闭,因此我无法检查其他解决方案.


小智 5

我有一个类似的问题,但我只是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);
Run Code Online (Sandbox Code Playgroud)

使用此上下文,仅将提取标头并将其file_get_contents填充$http_response_headerPHP变量。