2

我试图让我的页面输出它是 < head > + 一些正文,并将其发送到浏览器。

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

只要我不压缩内容,它就可以完美地工作。

例子:

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

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

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

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

在这里看到它,但没有 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 解决方案,而不是使用 .htaccess 在应用程序范围内启用 deflate

我该怎么做才能使刷新 gzip 内容起作用?

4

1 回答 1

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';
于 2013-08-10T15:32:37.773 回答