我正在尝试让我的页面输出<头> +一些正文,并将其发送到浏览器。
然后进行一些长的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压缩内容工作?
答案 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';