【问题标题】:Content-length and other HTTP headers?内容长度和其他 HTTP 标头?
【发布时间】:2012-04-01 11:09:40
【问题描述】:

如果我在生成普通 HTML 页面时设置此标头是否会给我带来任何好处?

我看到一些框架会设置这个头属性,我想知道为什么...... (以及其他标头,例如Content-Type: text/html

浏览器加载网站是否更快或更流畅?

ps:他们这样做:

ob_start();

... stuff here...

$content = ob_get_contents();
$length = strlen($content);

header('Content-Length: '.$length);

echo $content;

【问题讨论】:

  • 回答下面未列出的问题?

标签: php http-headers


【解决方案1】:

我认为这只是因为 HTTP 规范要求在所有可能的情况下都这样做。

应用程序应该使用该字段来指示消息体的传输长度,除非这被第 4.4 节中的规则禁止。

您也可以在Question of Deaomon 上查看at Pauls Answer

我想这也会回答你的问题。

如果您希望某人下载带有另一个标题的文件,您还应该使用 Content-Length: 例如

<?php
$file = "original.pdf"
$size = filesize($file);
header('Content-type: application/pdf');
header("Content-length: $size");
header('Content-Disposition: attachment; filename="downloaded.pdf"');
readfile($file);
?>

【讨论】:

    【解决方案2】:

    如果我在生成时设置此标头是否会给我带来任何好处 普通的html页面?

    浏览器加载网站是否更快或更流畅?

    对于动态生成的页面,通常不会。 Content-Length 让客户端知道文件有多大。但是,如果未指定Content-Length,则传输以块的形式发送(带有表示文件结束的特殊块)。前一种方法可以导致更快的传输,因为消除了分割成块的开销。但是,这通常最好保留给静态文件,因为缓冲整个内容以确定长度所需的资源可能超过通过设置 Content-Length 获得的任何优势。

    【讨论】:

    • 我从 Chrome 中检查了开发者工具中的标头,发现 Content-Length 标头已设置,即使我没有在 PHP 中设置。
    • 如果内容长度小于操作系统/网络服务器的发送缓冲区大小,Content-Length 将自动被网络服务器包含。但是,如果长度超过缓冲区,您将看到内容长度不会被发送,而是会使用Transfer-Encoding: chunked
    • 你知道我怎样才能知道缓冲区大小吗?
    • 默认情况下,Apache 使用操作系统缓冲区默认值作为其SendBufferSize。要确定 OS 缓冲区大小,您需要搜索 tcp send buffer size &lt;your_os&gt;,因为每个 OS 都不同。对于 Windows XP-7,它是 8192 字节。
    • 你是对的,在 chrome 中它是 8K :) 但是我认为对 html 文件使用 content-length 东西是不可靠的,因为它们可能被 gzip 压缩,所以 strlen( ) 尺寸不是真正的尺寸
    【解决方案3】:

    其背后的主要动机是在 HTTP 1.1 中重用现有的 TCP 连接。 Content-Length 可以为收件人划定响应结束的位置。 至于其他标头,例如指定 MIME 类型的 Content-Type,它们是为收件人准备的,以便她根据内容的类型知道如何处理结果 例如,在 Firefox 中,您可以指定对不同 MIME 类型执行的操作。如果您可以弹出浏览器的保存对话框或在查看器中使用Content-Typeapplication/pdf 打开PDF

    【讨论】:

    • 你的意思是像在同一个请求中请求两个页面?
    • 不,它们是在同一个 TCP 连接的上下文中发送的。这个概念称为 HTTP 持久连接。
    • hmmm 但是从我在维基百科中阅读的 http 1.1 浏览器连接默认情况下是持久的,所以这真的需要吗?
    • 该部分指的是 HTTP 1.1 中冗余的 Keep-Alive 标头。
    【解决方案4】:

    关于content-type: text/html,主要是告诉客户期望什么以及通常如何处理文件。在机器人的情况下,它可以用于 SEO 目的,因为它告诉机器人它正在查看什么类型的文件,这可以改变它的解析/排名方式。

    content-length 的情况下,它只是让客户端知道预期的文件有多大以及响应结束的位置。

    【讨论】:

      【解决方案5】:

      设置内容长度的一个好用处是当您想将响应发送给客户端时,即使您之后仍想执行更耗时的操作。

      请参阅 this answer,它解释说您将设置内容长度、编写输出,然后可以在脚本中执行进一步的操作,而无需让客户端再等待。

      【讨论】:

        【解决方案6】:

        获取远程文件大小的最佳方法(对我有用):

        $head = array_change_key_case(get_headers($file, TRUE));
        $filesize = $head['content-length'];
        

        【讨论】:

          【解决方案7】:

          改变

          $content = ob_get_contents();
          

          $content = ob_get_clean();
          

          【讨论】:

          • 为什么?请注意,问题不是问如何改进代码。它使用它作为他们在某些框架中看到的代码示例。他们的问题是,“如果我在生成普通 HTML 页面时设置此标头,是否会给我带来任何好处? ... 浏览器加载网站是否更快或更流畅?您对代码的反馈没有回答这个问题。
          • 这并没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
          猜你喜欢
          • 1970-01-01
          • 2013-01-23
          • 1970-01-01
          • 1970-01-01
          • 2012-12-02
          • 2022-01-28
          • 1970-01-01
          • 2011-03-19
          • 2014-08-07
          相关资源
          最近更新 更多