web服务器是否有可能用扩展的输出时间流来响应HTTP请求?


Is it possible for a web server to respond to a HTTP request with an extended time stream of output?

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

是。只需定期调用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);

是的,如果执行时间特别长,您需要担心的一件事是超时。这可能是PHP超时,也可能是浏览器超时(一般为2分钟)。

这个关于连接处理的PHP文档有相当多关于保持连接存活的好信息。