在控制台中运行PHP脚本时,该脚本的所有标准输出文本都会在脚本运行时显示在控制台窗口中。浏览器窗口是否可以在运行冗长的PHP脚本的同时在浏览器中接收状态报告,而不是在脚本结尾处获取所有输出结果?Web服务器是否可以使用扩展的输出时间流来响应HTTP请求?
回答
是的。只需定期调用flush()和ob_flush()。至少每120秒输出一次输出以保持与浏览器的连接至关重要。
一个粗略的例子:
while(!$done) {
//doWork();
echo number_format(100 * ($workDone/$workTotal)) . "% ";
flush();
ob_flush();
}
编辑:下面是我的ENV工作理念的一个任意证明:
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](http://pastebin.com/LzeTUnzi)代码中,我在加载开始之前调用[this](http://pastebin.com/27qkdkYD)函数,因此用户不应该尽快看到此文本浏览器加载地址? – Hubro 2011-04-18 22:38:35
奇怪的是,我尝试了一些简单的例子,看起来Google Chrome只在收到至少一个换行符后才开始显示输出(flush()的手册页也提到了一些浏览器在显示之前至少需要256字节的数据)。在flush之前尝试添加一个换行符(也许是一些填充)。 – 2011-04-18 22:49:02
我想说Chrome也有256字节的要求。输出任何东西的唯一情况是,当我收到有关'ob_flush'没有做任何事情的冗长警告时。 – Hubro 2011-04-18 22:55:57
是的,有一件事你不用担心,如果你有特别长的执行时间超时。这可能发生为PHP超时或浏览器超时(通常大约2分钟)。
这个关于connection handling的PHP文档有很多关于保持连接活着的好消息。
- 1. 是否可以向透明代理发出HTTP请求,并接收来自上游服务器的响应?
- 2. 实现HTTP服务器 - 是否必须响应所有请求?
- 3. http请求花费太长时间等待服务器响应
- 4. 如何测量服务器端HTTP请求和HTTP响应之间的时间?
- 5. Web服务器带宽是否包含整个HTTP请求/响应?
- 6. 是否可以使用webbrowser属性来发出http请求?
- 7. 在.NET中使用HTTP请求响应消费Web服务?
- 8. Cucumber/Ruby:是否可以拦截来自浏览器的HTTP请求/响应?
- 9. 跟踪来自Web服务器的传出HTTP请求
- 10. 使用tomcat我可以检查我的HTTP请求是否是对我的Web服务有效的请求?
- 11. 如何构建Firefox扩展来拦截HTTP请求和响应?
- 12. 来自HTTPS和HTTP Web服务的响应时间
- 13. Websphere Web服务器减缓我的输出流响应
- 14. WCF服务 - HTTP请求和响应
- 15. 请求:检查代理服务器是否被用来制作HTTP请求
- 16. 是否可以在POST命令后忽略来自Web服务器的响应?
- 17. Apache HTTP Web服务器请求
- 18. Web服务器shell脚本可以使用标准输入/输出来提供多个请求吗?
- 19. HTTP 1.1服务器如何响应HTTP 1.0请求?
- 20. 是否可以使用Python来测量响应时间?
- 21. 是否可以通过Web请求确定用户时间?
- 22. 使用httpcomponents处理流式响应时的多个http请求
- 23. 如何测量服务器的请求和响应时间?
- 24. HttpCore的HTTP请求/响应的流程
- 25. 我可以作为HTTP请求调用Web服务吗?
- 26. 你可以向HTTP服务器发出HTTPS请求吗?
- 27. 从Web服务器向CGI/FastCGI流程发送HTTP请求
- 28. 扩展.json的Http请求
- 29. 带出HTTP请求的HTTP响应
- 30. C#Web请求/服务器不可用错误/ HTTP头
当然,只要脚本关闭输出缓冲,然后定期输出状态消息。只要服务器不重写缓冲区刷新请求,就会在客户端看到这些消息。但是......至多缓冲区刷新/覆盖只是对服务器和底层操作系统的建议,即缓冲区应该被刷新。 – 2011-04-18 22:12:23