PHP:get_headers设置临时流_上下文

PHP:get_headers设置临时流_上下文,php,header,stream,http-headers,head,Php,Header,Stream,Http Headers,Head,我猜PHP的get_头不允许使用上下文,因此我必须更改默认的流上下文,以便只获取请求的头。这会导致页面上的其他请求出现一些问题。我似乎不知道如何重置默认的流上下文。我正在尝试类似的东西: $default = stream_context_get_default(); //Get default stream context so we can reset it stream_context_set_default( //Only fetch the HEAD array(

我猜PHP的get_头不允许使用上下文,因此我必须更改默认的流上下文,以便只获取请求的头。这会导致页面上的其他请求出现一些问题。我似乎不知道如何重置默认的流上下文。我正在尝试类似的东西:

$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,但我不希望使用Curl。谢谢

我最终使用该函数获取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;
}
$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);
这样叫,

$context = stream_context_create(array('http' => array('method' => 'HEAD')));
$headers = get_headers_with_stream_context($url, $context, 1);
它在不修改标准流上下文的情况下为您提供所需内容

请注意,如果传递的不是http url,则此函数将失败


get_headers()似乎还有一个额外的参数,但在我写这篇文章时,bug跟踪器已关闭,因此我无法在那里检查其他解决方案。

我做了以下操作,而不是接受答案,它将在PHP5.3及以上版本中工作,尽管我还没有完全测试它。(还有一个
stream\u context\u get\u params($context)
,但我认为这已经足够了。)

$stream\u context\u defaults=stream\u context\u get\u选项(stream\u context\u get\u default());
流\u上下文\u设置\u默认值(
排列(
“http'=>数组(
'方法'=>'头部'
)
)
);

对于($i=1;$i我也有类似的问题,但我只是在自定义流上下文中使用了
file\u get\u contents
函数

我是如何实现它的:

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;
}
$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);

使用此上下文时,只有头才会由
文件\u get\u contents
获取,并将填充
$http\u response\u header
PHP变量。

get\u headers不一致:这并不总是有效,
流式\u context\u set\u default()
无法“重置”有一个空的$stream\u context\u defaults数组。这有文档记录吗?我发布这篇文章是为了解决get\u headers缺少参数的问题。我确实意识到,设置默认值而不是创建新的上下文可能不是最明智的做法,但我想重新使用get\u headers方法。如果get\u headers没有,那就太好了他能够在自定义上下文中传递,如文件内容。在文档中没有清楚地看到。通过测试发现了这一点。