我猜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
有谁知道解决这个问题的方法吗?
我知道有人建议使用Curl,但我宁愿不使用这个。谢谢!
我最终使用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。
请注意,如果传递的不是http url,则此函数将失败。
似乎有一个功能请求为get_headers()提供额外的参数,但是当我写这篇文章时,错误跟踪器已经关闭,所以我无法检查其他解决方案。
我有一个类似的问题,但我只是使用自定义流上下文的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
将只获取标题,并将填充$http_response_header
PHP变量。
我没有使用公认的答案,而是做了以下操作,这将在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
从PHP 7.1.0开始,get_headers()
现在接受第三个参数作为上下文。
$context = stream_context_create(
array(
'http' => array('method' => 'HEAD')
)
);
$headers = get_headers($url, true, $context);