内容长度和其他HTTP头部信息?

20

如果我在生成普通HTML页面时设置此标头,是否会给我任何优势?

我发现一些框架将设置此标头属性,我想知道为什么... (连同其他标题,如Content-Type: text/html

是否可以使浏览器加载网站更快或更顺畅?

ps:它们的设置方式如下:

ob_start();

... stuff here...

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

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

echo $content;

以下未列出你要的答案? - Neysor
7个回答

21

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

除非第4.4节中的规则禁止使用,否则应用程序应使用此字段来指示消息正文的传输长度。

您还可以查看Pauls答案,并参考Deaomon的问题

我认为这也将回答您的问题。

如果您希望某人使用其他报头下载文件,则还应使用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);
?>

11
当生成普通HTML页面时,设置此标题是否会给我带来任何优势?
对于动态生成的页面,通常不会。Content-Length标题让客户端知道文件的大小。但是,如果未指定Content-Length,则传输将以块的形式发送(其中包含一个特殊块,表示文件的结尾)。前一种方法可以实现更快的传输,因为消除了将内容拆分成块的开销。但是,通常最好保留此方法用于静态文件,因为缓冲整个内容以确定长度所需的资源可能超过设置Content-Length所获得的任何优势。

我在Chrome的开发者工具中检查了头文件,发现即使我没有在PHP中设置它,Content-Length头文件也被设置了。 - ellabeauty
3
如果内容长度小于操作系统/网络服务器的发送缓冲区大小,Content-Length 将由网络服务器自动包括。然而,如果长度超过缓冲区,你会发现 Content-Length 不会被发送,而是会使用 Transfer-Encoding: chunked - webbiedave
你知道如何找出缓冲区大小吗? - ellabeauty
2
默认情况下,Apache使用操作系统缓冲区默认值作为其SendBufferSize。要确定操作系统缓冲区大小,您需要搜索tcp send buffer size <your_os>,因为每个操作系统都不同。对于Windows XP-7,它是8192字节。 - webbiedave
2
你是正确的,在Chrome中它是8K :) 然而我不认为使用content-length来确定HTML文件大小是可靠的,因为它们可能会被gzip压缩,所以使用strlen()函数得到的大小不是真正的大小。 - ellabeauty

2
它的主要动机是在HTTP 1.1中重复使用现有的TCP连接。Content-Length 可以为接收者划分响应结束的位置。至于其他头部,如指定MIME类型的Content-Type,它们是为了让接收者知道根据内容类型该做什么。例如,在Firefox中,您可以指定不同MIME类型的操作。如果Content-Typeapplication/pdf,则可以弹出浏览器的保存对话框或在查看器中打开PDF。

你的意思是在同一个请求中请求两个页面吗? - ellabeauty
不,它们是在同一TCP连接的上下文中发送的。这个概念被称为HTTP持久连接。 - Uku Loskit
从我在维基百科上阅读的内容来看,在http 1.1浏览器连接中默认是持久的,那么这真的有必要吗? - ellabeauty
那部分是指在HTTP 1.1中是多余的Keep-Alive头。 - Uku Loskit

2

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

content-length 的情况下,它只是让客户端知道可以期望多大的文件,因此知道响应何时结束。


0

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

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

0

设定 content-length 的一个据说很好的用途是当你想要将响应发送给客户端,即使之后还想执行更耗时的操作。

参见 this answer,它解释了您可以设置内容长度,编写输出,然后可以在脚本中执行进一步的操作,而不会让客户端等待更长时间。


0

更改

$content = ob_get_contents();

$content = ob_get_clean();

为什么?请注意,这个问题并不是在问如何改进代码。它只是将其作为一些框架中看到的代码示例。他们的问题是:“如果我在生成普通HTML页面时设置此标题,是否会给我带来任何优势?...浏览器是否会更快或更流畅地加载网站?”你对代码的反馈并没有回答那个问题。 - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接