php flush无法正常工作

时间:2011-07-22 10:15:21

标签: php configuration buffer flush

我的冲洗机制停止工作,我不知道为什么。 我现在正试图运行一个简单的冲洗示例,没有运气:

echo "before sleep";
flush();
sleep(5);
echo "after sleep";

在做了一些阅读之后,我最近在我的服务器上安装了ngin x,我要求为我的域禁用它。 (服务器管理员说他为此特定域禁用了它)

另外,我尝试禁用gzip,将这些行添加到.htaccess

SetOutputFilter DEFLATE
SetEnv no-gzip dont-vary

另外,尝试将这些添加到我的php文件

ini_set('output_buffering','on');
ini_set('zlib.output_compression', 0);

没有任何帮助。它睡了5秒然后将所有内容显示在一起。 我之前一直在使用它,并且一直在使用输出缓冲区(ob_start,ob_flush等,现在只是试图让最简单的例子工作)

2 个答案:

答案 0 :(得分:0)

“停止工作”是一个非常高的水平。实际上你应该看一下有效与否的结果。

这可以通过监控网络流量来完成。您将看到已经完成了多少响应以及发送的编码。

如果响应被压缩,大多数压缩函数在压缩它们之前需要一定数量的字节。因此,即使您使用flush()来表示PHP刷新输出缓冲区,仍然可以在PHP输出过滤中或服务器等待更多来进行压缩。因此,在apache完成压缩之后,检查您的PHP配置是否也进行压缩并禁用它。

如果您不想监控网络流量,curl命令行实用程序也能很好地显示正在发生的事情,并且可能更容易使用它而不是网络监控

curl -Ni --raw URL

确保使用-N开关,该开关将禁用curl的缓冲,以便您直接看到脚本/服务器输出。

请参阅我之前的回答中的Inspecting HTTP Compression Problems with Curl部分,其中显示了一些curl命令,用于在压缩完成后查看请求的输出。

curl能够显示最终未压缩的压缩数据,并且您可以为每个请求禁用压缩,因此无论服务器或PHP输出压缩设置如何,您都可以测试更多差异化。

答案 1 :(得分:0)

<?php
ini_set('zlib.output_handler', '');
ini_set('zlib.output_compression', 0);
ini_set('output_handler', '');
ini_set('output_buffering', false); 
ini_set('implicit_flush', true); 
apache_setenv( 'no-gzip', '1' );


for($i = 0; $i < 5; $i++){
    echo str_repeat(chr(0), 4096); #flood apache some null bytes so it feels the packet is big enough to be sent...
    echo "$i<br/>";
    flush();
    sleep(1);
}
?>