内容长度和其他HTTP标头?

时间:2012-03-15 21:14:46

标签: php http-headers

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

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

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

ps:他们这样做:

ob_start();

... stuff here...

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

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

echo $content;

7 个答案:

答案 0 :(得分:17)

我认为只有因为HTTP规范才会在每种情况下都这样做。

  

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

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

我认为这也会回答你的问题。

如果您希望有人下载带有其他标题的文件,您也应该使用Content-Length: e.g。

<?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);
?>

答案 1 :(得分:11)

  

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

     

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

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

答案 2 :(得分:2)

它背后的主要动机是在HTTP 1.1中重用现有的TCP连接。 Content-Length可以划分收件人的回复结束位置。 至于其他标题,如指定MIME类型的Content-Type,它们是针对收件人的,这样她就知道如何处理结果,具体取决于内容的类型 例如,在Firefox中,您可以指定使用不同MIME类型执行的操作。如果您可以弹出浏览器的保存对话框,或者使用Content-Type application/pdf

的{{1}}在查看器中打开PDF

答案 3 :(得分:2)

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

content-length的情况下,只是让客户知道文件的大小,以及响应结束的位置。

答案 4 :(得分:0)

获取远程文件大小的最佳方式(对我而言):

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

答案 5 :(得分:0)

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

请参阅this answer,说明您已设置内容长度,编写输出,然后可以在脚本中执行进一步操作,而不会让客户端再等待。

答案 6 :(得分:0)

改变


private var firstDetected = true

for (barcode in barcodes) {
            if (barcodes.size > 0 && firstDetected) {
                LoggingUtility.writeLog("Analyzer",
                        "MLKitBarcode Result",
                        "Barcode is ${barcode.rawValue!!}")
                firstDetected = false
       }
}

$content = ob_get_contents();