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

Php AJAX在执行完成之前返回数据,php,ajax,Php,Ajax,我有一个正在执行AJAX请求的页面。该页面的目的是返回电子邮件的标题,我已经准备好了。问题是,这是为邮箱中的每封电子邮件调用的。这意味着它将在盒子中的每封邮件中调用一次。这是一个问题的原因,因为imap_open函数的执行时间约为1秒,因此每次调用它时,都会执行该函数。是否有一种方法可以进行AJAX调用,该调用将返回可用的信息并保持执行,以防止对执行时间较慢的函数进行多次调用 干杯, Gazler.听起来你需要处理每次电话中收到的电子邮件数量。在这一点上,您可以一起返回它们的数据,并在客户端解析

我有一个正在执行AJAX请求的页面。该页面的目的是返回电子邮件的标题,我已经准备好了。问题是,这是为邮箱中的每封电子邮件调用的。这意味着它将在盒子中的每封邮件中调用一次。这是一个问题的原因,因为imap_open函数的执行时间约为1秒,因此每次调用它时,都会执行该函数。是否有一种方法可以进行AJAX调用,该调用将返回可用的信息并保持执行,以防止对执行时间较慢的函数进行多次调用

干杯,
Gazler.

听起来你需要处理每次电话中收到的电子邮件数量。在这一点上,您可以一起返回它们的数据,并在客户端解析出来。但是,这一过程不能永远持续下去,而且服务器无法在http请求得到响应后启动额外数据的返回,因此您必须在以后进行后续调用以处理更多电子邮件。

听起来您需要处理每次调用所收到的电子邮件数量。在这一点上,您可以一起返回它们的数据,并在客户端解析出来。但是,这一过程不能永远持续下去,而且服务器无法在http请求得到响应后启动额外数据的返回,因此您必须在以后进行后续调用以处理更多电子邮件。

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

听起来你有一个非常常见的问题,那就是基本上你发出了很多AJAX请求,每个请求都需要做一些工作,实际上只有其中一个需要做一次,然后你就做好了

我不在PHP中工作,但是如果可以在请求之间持久化imap_open的返回值或任何它的副作用,那么您应该尝试这样做,然后重用保存的资源

一些伪代码:

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

persisted_resource.use()....
其中,持久化的_资源应该是存储在会话范围、应用程序范围或PHP可用的任何比请求寿命更长的变量


然后,您可以让每个请求检查此变量,这样只有一个请求需要调用imap_open,或者您可以在加载页面时对其进行初始化。希望这会有所帮助。

有一些技术允许您配置服务器和Javascript以允许本质上的“反向AJAX”(在Google/Wikipedia上查找“comet”或“reverse AJAX”)。然而,这并不是非常简单,而且对于你正在做的事情来说,可能不值得花那么多精力来设置它

听起来你有一个非常常见的问题,那就是基本上你发出了很多AJAX请求,每个请求都需要做一些工作,实际上只有其中一个需要做一次,然后你就做好了

我不在PHP中工作,但是如果可以在请求之间持久化imap_open的返回值或任何它的副作用,那么您应该尝试这样做,然后重用保存的资源

一些伪代码:

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

persisted_resource.use()....
其中,持久化的_资源应该是存储在会话范围、应用程序范围或PHP可用的任何比请求寿命更长的变量


然后,您可以让每个请求检查此变量,这样只有一个请求需要调用imap_open,或者您可以在加载页面时对其进行初始化。希望这会有所帮助。

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


困难的部分是,您需要JavaScript库能够处理部分输入。也就是说,您需要在收到下载的数据后立即访问这些数据。我相信这是非常困难的,但一些流行的库(如jQuery)只允许在传输完成时读取数据。

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


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

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

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

emailHeaders.php?start=25&end=50
Javascript将保持状态并请求数据,直到所有数据都加载完毕。或者你可以做一些奇特的事情,比如创建客户端策略,确定何时请求数据以及请求什么数据


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

批处理结果。在一次加载所有电子邮件和加载单个电子邮件之间,您可以批处理电子邮件标题并将其发送回。调整此数字,直到您在响应性和内容之间找到合适的匹配

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

emailHeaders.php?start=25&end=50
Javascript将在所有数据加载之前保持状态并请求数据,或者您可以做一些花哨的事情,比如创建客户端策略,确定何时请求数据以及请求什么数据