AJAX在执行完成之前返回数据

时间:2010-01-14 15:00:46

标签: php ajax

我有一个页面,我正在执行AJAX请求。页面的目的是返回电子邮件的标题,我工作正常。问题是,邮箱中的每封电子邮件都会调用此方法。这意味着它将在每个邮箱中调用一次。这是一个问题的原因是因为imap_open函数的执行时间大约是一秒,因此每次调用它时都会执行此操作。有没有办法进行AJAX调用,它会返回可用的信息并继续执行以防止多次调用执行时间较慢的函数?

干杯, Gazler。

4 个答案:

答案 0 :(得分:2)

有些技术允许您配置服务器和Javascript以允许基本上“反向AJAX”(在Google / Wikipedia上查找“comet”或“反向AJAX”)。然而,它并不是非常简单,对于你正在做的事情,它可能不值得设置它的所有工作。

听起来你有一个非常普遍的问题,基本上你正在解雇一些AJAX请求,他们每个人都需要做一些实际工作,其中只有一个人需要做一次然后你就会好。

我不能在PHP中工作,但是如果可以保持imap_open的返回值或者它的副作用是否跨越请求,那么你应该尝试这样做然后只重用那个保存的资源。

一些伪代码:

if (!persisted_resource) {
    persisted_resource = imap_open()
}

persisted_resource.use()....

其中persisted_resource应该是一些存储在会话范围,应用程序范围或PHP可用的任何变量中的变量,而不是请求。

然后您可以让每个请求检查此变量,因此只有一个请求必须调用imap_open,或者您可以在加载页面时初始化它。希望这有用。

答案 1 :(得分:1)

听起来好像你需要处理每次通话时收到的电子邮件。此时,您可以将所有这些数据一起返回并在客户端解析出来。但是,该进程不能永远继续,并且在响应http请求后服务器无法启动其他数据的返回,因此您将不得不进行后续调用以便稍后处理更多电子邮件。

答案 2 :(得分:1)

服务器端PHP脚本可以配置为在生成后立即发送输出。您基本上需要禁用所有可能导致缓冲的功能,例如output_bufferingoutput_handler,HTTP压缩,中间代理......

困难的部分是您需要JavaScript库能够处理部分输入。也就是说:您需要在收到下载数据后立即访问。我相信它是technically possible但是像jQuery这样的流行库只允许在传输完成时读取数据。

答案 3 :(得分:1)

批量处理结果。在加载所有电子邮件与一次加载一封电子邮件之间,您可以批量处理电子邮件标题并将其发回。调整此数字,直到您发现响应性和内容之间的良好匹配。

在这种情况下,PHP脚本会收到范围请求,例如

emailHeaders.php?start=25&end=50

Javascript将以块的形式维护状态和请求数据,直到加载所有数据。或者你可以做一些花哨的事情,比如创建关于何时请求数据的客户端策略以及要请求的数据。

浏览器是另一个瓶颈,因为大多数浏览器在任何给定时间只允许2个传出连接。