【问题标题】:PHP flush the output to browserPHP将输出刷新到浏览器
【发布时间】:2012-08-08 04:14:46
【问题描述】:

我从事一个 PHP 项目,我使用 flush()

我做了很多搜索,发现 PHP 将脚本的长输出分块发送到浏览器,并且在脚本终止时不会发送所有巨大的数据。

我想知道这个数据的大小,我的意思是 PHP 必须输出多少字节才能将它们发送到浏览器。

【问题讨论】:

  • 我很确定浏览器在决定实际显示之前也有某种限制。
  • yeh.modern 浏览器必须接收 512 字节才能显示内容,但我想知道 php 限制自动将输出刷新到浏览器(不调用 flush() 函数)
  • flush() 页面上的描述部分包含我能找到的最多信息——对此没有固定答案。
  • 不,php 不要使用它。在我的系统中 output_buffering 已关闭,但是当我运行带有 100,000 次循环的脚本时,脚本会逐步从 php 中捕获数据,这意味着 php 以块而不是脚本的形式发送输出终止..我知道 output_buffering=on 做什么,但是没有这个指令的 php 在 LARGE 脚本上发送块大小输出

标签: php flush


【解决方案1】:

将数据分块的不仅是 PHP;这实际上是 Apache(或 Tomcat 等)的工作。这就是为什么默认是关闭 PHP 中的“分块”并将其留给 Apache。即使你从 PHP 强制刷新,它仍然会被 Apache 困住。来自手册:

flush() 可能无法覆盖您网站的缓冲方案 服务器,它对任何客户端缓冲没有影响 浏览器。它也不会影响 PHP 的用户空间输出缓冲 机制。这意味着您必须同时调用 ob_flush() 和 如果你正在使用 flush() 来刷新 ob 输出缓冲区。

有一篇关于传输编码/分块的维基百科文章:http://en.wikipedia.org/wiki/Chunked_transfer_encoding

Apache 使用 GZIP 或 deflate 编码变得更加复杂;您需要访问 apache 服务器来了解如何配置它。

【讨论】:

    【解决方案2】:

    我认为你错了 查看此代码

    echo str_repeat(' ',1024);
    for($i=0;$i<10;$i++){
    echo $i;
    flush();
    sleep(1);   
    

    如果你运行它,你会看到每 1 个字节发送到浏览器并打印 //str_repeat 用于显示数据的浏览器缓冲区,仅此而已

    【讨论】:

    • 这完全取决于您的网络服务器配置和浏览器。最快的方法是在你的 apache 上打开 GZIP,然后看看会发生什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    • 2020-09-26
    • 2015-02-18
    • 2012-04-19
    相关资源
    最近更新 更多