PHP get_headers:通过代理发送 HTTP HEAD 请求
把流上下文直接传给 get_headers,有意识地选择 HEAD,并决定是否跟随重定向。
在 PHP 中,get_headers() 接受流上下文作为其第三个参数。在 PHP 8 上,针对 HTTP URL 的标头检查可以携带自己的代理配置:
$context = stream_context_create([
'http' => [
'proxy' => 'tcp://proxy.example.net:8080',
'request_fulluri' => true,
'method' => 'HEAD',
'follow_location' => 0,
'timeout' => 10,
],
]);
$headers = get_headers('http://example.net/file.zip', false, $context);
if ($headers === false) {
throw new RuntimeException('Header request failed');
}代理是 HTTP 流包装器的 TCP 端点。对于这次公开的 HTTP 检查,请把占位主机和端口换成 HTTP 代理列表中未经身份验证的候选。request_fulluri 会像许多正向代理所期望的那样,在 HTTP 请求行中提供完整的目标 URI。这个上下文只属于本次调用;它不会改变其他 URL 读取所使用的默认上下文。
尽管函数名如此,它默认的请求方法是 GET。显式的 HEAD 方法向服务器索取响应元数据,而不取回对应的响应正文。服务器可能拒绝 HEAD 或以不同方式处理,因此一次成功的标头检查并不能证明后续下载一定会成功。
这里关闭了跟随重定向,以便检查第一个响应。此时 Location 标头和重定向状态就是有用的结果,而不是去获取另一个 URL 的指令。如果检查应当跟随重定向,请有意识地改变这一策略,并把额外响应标头计算在内。
false 参数会保留带索引的标头数组。当关联解析更有用时,请使用 true。