PHP:get_headers设置临时流_上下文
我猜PHP的get_头不允许使用上下文,因此我必须更改默认的流上下文,以便只获取请求的头。这会导致页面上的其他请求出现一些问题。我似乎不知道如何重置默认的流上下文。我正在尝试类似的东西: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(
$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没有,那就太好了他能够在自定义上下文中传递,如文件内容。在文档中没有清楚地看到。通过测试发现了这一点。