2

我阅读了一些关于设置将要提供的文件的内容长度的文章。与分块下载相比,它有一些好处。当内容长度未知时,服务器提供块(无论如何都不知道块的大小)。

在 PHP 中,我使用 ob_gzhandler 压缩 html、js 和 css 文件以及其他基于文本的内容。在 gzip 输出之前设置原始内容长度会导致奇怪的副作用,因为长度与 gzip 输出的长度不匹配。我注意到延迟或浏览器报告编码错误。

我看到了一个技巧(也在stackoverflow上)在gzip压缩后设置内容长度以确保它报告正确的大小。但是当我这样做时,内容不再被压缩。

问题是,这种行为正确吗?gzip 压缩的内容是否总是分块发送?内容长度是否仅适用于未压缩的文件?

这里有一些代码片段:

1 导致压缩和分块文件传输:

ob_start('ob_gzhandler');
echo $sResult;

2 指定内容长度的正常文件传输结果(但需要 gzipped 和内容长度):

ob_start('ob_gzhandler');
echo $sResult;
header('Content-Length: '.ob_get_length()); 

这里有一些http头结果的图片: 1 压缩和分块

2 设置内容长度时期望 Gzipped 但正常传输

4

1 回答 1

2

在此处找到解决方案/技巧: 如何确定压缩文件的内容长度?

做成这样:

// clear output buffers
while( ob_get_level() )
 { ob_end_clean(); }

< send http headers here >

ob_start();
ob_start('ob_gzhandler');
echo $sResult;
if( !headers_sent() )
{
   ob_end_flush(); // Flush the output from ob_gzhandler
   header('Content-Length: '.ob_get_length());
   ob_end_flush(); // Flush the outer ob_start()
}

对我来说不清楚为什么这有效,但似乎工作得很好。内容现在已压缩并具有内容长度(未分块)。

为了证明这一点,这里有一个截图:

gzip 和内容长度

干杯! ;-)

于 2013-12-02T23:02:19.043 回答