真实世界的问题:我正在以恐怖的方式生成一个页面。此页面是一个由用户检索的xml(curl,file_get_contents或任何可以由服务器端脚本编写的)。 一旦用户发出请求,他就开始等待,我开始从数据库中检索大量数据并用它们构建一个xml(使用php dom对象)。完成后,我点击“print $ document-> saveXML()”。创建这个40兆字节的文档大约需要8分钟。然后,当它准备好时,我提供页面/文档。现在我有一个60秒连接超时的用户:他说我需要每60秒发送第一个八位字节。我怎么能做到这样的事情?
由于发布23987452行代码没用,因为没有人会读它们,我会解释为这个页面服务的脚本是非常伪伪代码:
1)我无法发送真实数据,因为它是一个xml文档,它必须以"<?xml..."
开头,以免弄乱解析器。
2)用户无法处理firewall / serverconfig
3)我无法处理“购买更强大的服务器” 4)我尝试在脚本顶部使用ob_start(),然后在每个循环的开头使用"header("Transfer-Encoding: chunked"); ob_flush(); "
但没有:在8分钟之前没有任何事情发生。
帮助我们!!
答案 0 :(得分:1)
我会
生成随机值
启动XML生成脚本作为后台进程(参见例如here)
让生成脚本将XML写入文件,并在脚本完成时将随机值作为名称
经常轮询该空文件的存在,例如每10秒使用一次Ajax请求,直到它出现。然后从文件中获取XML。
答案 1 :(得分:0)
您发送填充并仍然是有效的XML。琐碎的例子包括许多地方的空白或评论。一旦发送了XML声明,就可以开始发表评论,并继续发送填充:
<?xml version="1.0">
<!-- this comment to prevent timeouts:
30
60
90
⋮
或者其他什么,当然,确切的数据并不重要。
这是简单的解决方案。更好的解决方案是使该生成在后台运行,例如,使用AJAX每10秒轮询服务器以检查它是否完成。或者实现备用通知方法(例如,在文档准备好时通过电子邮件发送URL)。
如果这不是浏览器访问,您可能需要一个简单的API:有一个请求开始生成文档,另一个请求获取它。获取它的那个可以返回“尚未准备好”,例如,HTTP状态代码500,503或504.然后,请求的脚本应该稍后重试。 (例如,对于curl
,--retry
选项会执行此操作。)