如何刷新html页面的gzip压缩部分

时间:2013-08-10 10:11:56

标签: php apache zlib mod-deflate

我正在尝试让我的页面输出<头> +一些正文,并将其发送到浏览器。

然后进行一些长的mysql查询并输出页面的其余部分。

只要我不对内容进行gzip,这就完美无缺。

示例:

我使用的代码的简化示例:

<?php
ini_set('output_buffering', 'on');

echo "head..wait 3 secs</br>";
ob_flush();
flush();

sleep(3);
echo 'tail';
?>

直播here,但没有gzip

或者我正在努力工作:

<?php
ini_set('output_buffering', 'on');
ini_set('zlib.output_compression', 'On');

echo "head...wait 3 secs</br>";
ob_flush();
flush();

sleep(3);
echo 'bar';                     
?>

哪个不起作用请参阅:here

我需要这个在我的应用程序中工作,但不是在所有页面上工作(有些不需要gzip或是自己处理它们的库,例如caldav库),所以我更喜欢php解决方案而不是启用deflate应用程序与.htaccess

我可以做些什么来使冲洗gzip压缩内容工作?

1 个答案:

答案 0 :(得分:2)

我无法判断这是否会对您的问题有所帮助,因为即使不使用gzip(zlib)也可能发生缓冲问题。

首先可能是apache已经加载了deflate模块(mod_deflate或mod_gzip):
您可以尝试为当前脚本禁用它,如下所示:

apache_setenv('no-gzip', 1);

其次可能是浏览器正在使用内部缓冲区进行响应(对于IE,较新的Firefox和WebKit浏览器,大约1kB是常见的,但某些浏览器可能或多或少)。
这可以通过回应至少1kb的空白来解决,例如:

echo str_repeat(' ', 1024);

请注意,使用zlib时,回显1kb的空白(未压缩)和刷新将不会触发这些浏览器解析和呈现任何内容,直到收到~1kb的压缩数据。

第三,如果使用会话(在脚本中显式或通过php.ini session.auto_start),您需要关闭会话以便发送输出:

session_write_close();

我认为您的问题在于浏览器缓冲区和zlib。您可能需要为浏览器创建超过1kb的压缩数据才能呈现它。

- 我曾经尝试过用zlib创建刷新,并且相信我这是为浏览器开始处理而渲染的大量文本,最后我必须回显一个图像文件(已经压缩)为了它的工作。

ini_set('output_buffering', 'On');
//ini_set('implicit_flush', 'On');
ini_set('zlib.output_compression', 'On'); // by default 4kB
//ini_set('zlib.output_compression_level', 1);

echo "head...wait 3 secs</br>\n";
echo str_repeat("\n ", 500); // this is enought to work fine without zlib
echo '<span style="display:none">';
readfile('path/to/an/image/file.png'); // around 8kB (4kB should be enough)
echo '</span>';
ob_flush();
flush();

sleep(3);
echo 'bar';