发送空数据包不会使连接超时

时间:2011-09-29 14:40:35

标签: php

真实世界的问题:我正在以恐怖的方式生成一个页面。此页面是一个由用户检索的xml(curl,file_get_contents或任何可以由服务器端脚本编写的)。 一旦用户发出请求,他就开始等待,我开始从数据库中检索大量数据并用它们构建一个xml(使用php dom对象)。完成后,我点击“print $ document-> saveXML()”。创建这个40兆字节的文档大约需要8分钟。然后,当它准备好时,我提供页面/文档。现在我有一个60秒连接超时的用户:他说我需要每60秒发送第一个八位字节。我怎么能做到这样的事情?

由于发布23987452行代码没用,因为没有人会读它们,我会解释为这个页面服务的脚本是非常伪伪代码:

  • 从数据库中获取所有数据:一组巨大的行
  • 创建一个domdocument元素
  • 循环遍历每一行并将一个节点元素添加到domdocument以包含一段数据
  • 调用$ dom-> saveXML()将文档作为字符串
  • 打印字符串,以便用户检索xml文档

1)我无法发送真实数据,因为它是一个xml文档,它必须以"<?xml..."开头,以免弄乱解析器。

2)用户无法处理firewall / serverconfig

3)我无法处理“购买更强大的服务器”

4)我尝试在脚本顶部使用ob_start(),然后在每个循环的开头使用"header("Transfer-Encoding: chunked"); ob_flush(); " 但没有:在8分钟之前没有任何事情发生。

帮助我们!!

2 个答案:

答案 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选项会执行此操作。)