【问题标题】:jQuery times out waiting for server to respond backjQuery 超时等待服务器响应
【发布时间】:2013-03-14 11:25:13
【问题描述】:
背景:
- 我有两个页面(index.php 和 script.php)。
- 我有一个从 index.php 调用 script.php 的 jQuery 函数。
- script.php 将进行大量数据处理,然后将这些数据返回给 index.php,以便向用户显示。
问题:
- index.php 似乎正在超时,因为 script.php 需要很长时间才能完成。 script.php 有时可能需要长达 4 小时才能完成处理,然后才能将数据返回到 index.php。
- 我说 index.php 超时的原因是 b/c 它永远不会更新,即使在 script.php 停止处理之后,它也只是用沙漏呆在那里。
- 我确定 script.php 确实成功完成了处理 b/c 我也在将输出写入日志文件,并看到所有内容都在处理中。
- 如果 script.php 处理的数据不多,则 index.php 将按预期更新。
- 调用 script.php 时,我没有在 index.php 内的函数中设置任何超时值。
在等待很长时间 script.php 完成后,是否有更好的方法让 index.php 更新?我正在使用 FireFox,这可能是 FireFox 的问题吗?
【问题讨论】:
标签:
php
javascript
jquery
【解决方案1】:
您真的希望 ajax 调用需要四个小时才能响应吗?这在网络和浏览器的正常工作方式中没有什么意义。我强烈建议重新设计。
也就是说,jQuery 的 $.ajax() 调用有一个超时值,您可以将其设置为此处描述的选项:http://api.jquery.com/jQuery.ajax/。我不知道浏览器是否允许将其设置为长达四个小时并且仍然可以正常运行。在任何情况下,要求保持浏览器连接打开并持续四个小时都不是一个高概率操作。如果有一个短暂的打嗝,你会怎么做?重新开始?这不是一个好的设计。
作为重新设计,我建议您将问题分解成更小的部分,这些部分可以在更短的 ajax 调用中得到满足。如果你真的想要一个四小时的操作,那么我建议你用一个 ajax 调用开始操作,然后每隔几分钟从浏览器轮询一次,询问工作何时完成。最终完成后,您可以检索结果。这将与 ajax 调用和浏览器的正常工作方式更加兼容,并且如果在四个小时内出现短暂的互联网故障,它也不会受到影响。
如果可能,您的第一个 ajax 调用还可以返回操作可能需要多长时间的近似值,这可以在等待结果的浏览器中提供一些有用的 UI。
这是一种可能性:
步骤 1. 发送 ajax 调用请求作业开始。立即收到作业 ID 和有关作业预计时间的任何相关信息。
步骤 2. 根据作业的估计时间计算轮询间隔。如果估计是四个小时,而且估计通常是准确的,那么您可以设置一个计时器,并在两个小时后再次询问。在请求数据时,您发送第一个 ajax 调用返回的作业 ID。
第 3 步。当您接近预计完成时间时,您可以将轮询间隔缩短到几分钟。最终,您将收到一个轮询请求,说明数据已完成并将数据返回给您。如果我正在设计服务器,我会将数据缓存在服务器上一段时间,以防客户端出于任何原因再次请求它,这样您就不必重复四个小时的过程。
哦,然后我会考虑更改服务器上的设计,以便每隔四个小时定期请求任何内容。它应该以某种批处理方式(例如,一天几次)预先构建和预先缓存,或者应该重做整个方案,以便可以在不到一分钟而不是四个小时内满足常见查询。
【解决方案2】:
是否可以定期将响应发送回 index.php 以“保持活力”?如果没有,也许将您的脚本拆分为几个较小的脚本,并以一个小时的时间块运行它们,而不是您上面提到的 4 小时。