【问题标题】:Is it possible for a web server to respond to a HTTP request with an extended time stream of output?Web 服务器是否可以响应具有扩展时间输出流的 HTTP 请求?
【发布时间】:2011-08-08 05:51:04
【问题描述】:

当您在控制台中运行 PHP 脚本时,该脚本的所有标准输出文本都会在脚本运行时显示在控制台窗口中。浏览器窗口是否有可能在运行冗长的 PHP 脚本时类似地在浏览器中接收状态报告,而不是在脚本结束时转储所有输出?

【问题讨论】:

  • 当然,只需让脚本关闭输出缓冲,然后定期输出状态消息。只要服务器不覆盖缓冲区刷新请求,您就会看到这些消息显示在客户端中。但是......充其量,缓冲区刷新/覆盖只是对服务器和底层操作系统的建议,应该刷新缓冲区。

标签: php apache http stdout


【解决方案1】:

是的。只需定期调用 flush() 和 ob_flush() 即可。至少每 120 秒写入一些输出以保持与浏览器的连接非常重要。

一个粗略的例子:

    while(!$done) {
        //doWork();
        echo number_format(100 * ($workDone/$workTotal)) . "% ";
        flush();
        ob_flush();
    }

编辑:这是在我的环境中工作的任意概念证明:

print('hello');
print(str_repeat(".\n", 2048));
flush();
//this might be a safe way to only flush the buffer if necessary?
if(ob_get_length())
    ob_flush();
sleep(60);

【讨论】:

  • 没用。在this 代码中,我在加载开始之前调用了this 函数,所以用户不应该在浏览器加载地址后立即看到此文本吗?
  • 奇怪的是,我尝试了一些简单的例子,似乎谷歌浏览器只有在收到至少一个换行符后才开始显示输出(flush() 的手册页还提到一些浏览器至少需要 256 个字节在它们显示之前的数据)。尝试在刷新之前为您的回声添加一个换行符(可能还有一些填充)。
  • 我想说 Chrome 也有 256 字节的要求。它输出任何东西的唯一情况是当我收到关于ob_flush 的冗长警告时没有做任何事情。
  • re: ob_flush() 抛出错误,看起来一种方法可能只是在缓冲区不为空时才刷新缓冲区。我会再次编辑。
【解决方案2】:

是的,如果执行时间特别长,您需要担心的一件事是超时。这可以作为 PHP 超时或浏览器超时(通常大约 2 分钟)发生。

这个关于 connection handling 的 PHP 文档有很多关于保持连接活动的好信息。

【讨论】:

    猜你喜欢
    • 2016-08-13
    • 1970-01-01
    • 2019-12-07
    • 2017-02-12
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    相关资源
    最近更新 更多