PHP ob_gzhandler,设置Content-Length禁用gzip压缩输出

时间:2013-12-02 16:07:17

标签: php gzip content-length content-encoding transfer-encoding

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

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

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

问题是,这种行为是否正确? gzip压缩内容是否始终发送?仅对于未压缩的文件是否需要内容长度?

这里有一些代码片段:

1 gzip和chunked文件传输的结果:

ob_start('ob_gzhandler');
echo $sResult;

2 在指定内容长度的正常文件传输中的结果(但期望gzip和内容长度):

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

这里有一些http标题的图片结果: 的 1 Gzipped and Chuncked

2 Expect Gzipped but normal transfer when set content-length

1 个答案:

答案 0 :(得分:2)

在这里找到解决方案/技巧: How to determine the Content-Length of a gzipped file?

制作于此:

// 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压缩的,并且内容长度(不分块)。

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

gzipped and content-length

干杯! ; - )