2

我试着寻找这个,我相信我已经知道答案了,但很重要的是我没有错,所以我开始了..

调用时get_headers,即使该函数仅返回标头,我是否会检索整个文件,还是会如预期的那样仅检索标头而不检索其他文件?

我猜是最后一个,但如果我错了,这会导致一些严重的问题。我还注意到有一个全局设置我可以更改为发送 HEAD 请求而不是默认的 GET 请求,这就是我为什么问我自己到底发生了什么。


编辑

也许这个功能是一个更好的选择?stream_get_meta_data还是他们实际上做同样的事情?

4

3 回答 3

1

如果您熟悉 C,还可以查看源代码。

函数在这里定义。我很快查看了这个,它似乎是一个仅标头请求,请参见第 715 行:

STREAM_ONLY_GET_HEADERS
于 2013-10-07T00:46:40.820 回答
0

不幸的是,您是对的,只需阅读 PHP 手册:

get_headers() 返回一个数组,其中包含服务器为响应 HTTP 请求而发送的标头。

另请查看示例。

好的,下次我应该多注意问题的制定。

是的,如果请求类型设置为 GET(标准),您将获得全部内容。您可以将其更改为 HEAD,但这不是您想要的。

于 2013-10-06T23:02:25.190 回答
0

得到

请求指定资源的表示。使用 GET 的请求应该只检索数据并且应该没有其他效果。(其他一些 HTTP 方法也是如此。) W3C 已经发布了关于这种区别的指导原则,称“Web 应用程序设计应遵循上述原则,但也应遵循相关限制。”

请求与对应于 GET 请求的响应相同的响应,但没有响应正文。这对于检索写入响应标头中的元信息很有用,而无需传输整个内容。

维基百科/Hypertext_Transfer_Protocol

PHP-docs 清楚地指出正常get_headers()使用 GET 请求,但您可以强制它使用 HEAD 代替,如下所示:

<?php
// By default get_headers uses a GET request to fetch the headers. If you
// want to send a HEAD request instead, you can do so using a stream context:
stream_context_set_default(
    array(
        'http' => array(
            'method' => 'HEAD'
        )
    )
);
$headers = get_headers('http://example.com');
?>
于 2013-10-06T23:03:25.820 回答