在 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。

相关文章