【问题标题】:php flush not workingphp刷新不起作用
【发布时间】:2011-07-22 10:15:21
【问题描述】:

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

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 等,现在只是试图让最简单的示例工作)

【问题讨论】:

  • 只是猜测:一些浏览器在开始渲染之前至少需要接收 256 个字节。
  • 是的,我也试过了......仍然无法正常工作。虽然是 10 倍

标签: php configuration buffer flush


【解决方案1】:

“停止工作”是一个相当高的水平。您实际上应该看看哪些有效或无效以了解更多信息。

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

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

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

curl -Ni --raw URL

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

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

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

【讨论】:

    【解决方案2】:
    <?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);
    }
    ?>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2016-06-02
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多