2008-12-08 175 views
1

我会直截了当!AJAX,PHP会话和同步请求

当用户提交他们的搜索时,我的JavaScript发送了大约20个AJAX请求到我的PHP文件以响应(通过外部Web API)。结果存储在会话数组中的数组中。

我读过,浏览器将只允许2个同时请求到服务器。

我的第一个问题是,虽然仍有多个请求仍在等待响应,但AJAX“添加到购物篮”请求将不起作用,因为它仍在等待其他请求完成。

我的第二个(和更恼人的)问题是,正在同时处理2个请求似乎在写对方,这样,当所有的反应是完整的只有一半是会话阵列英寸无论是所有奇数还是偶数,取决于最终请求是奇数还是偶数。

我不希望单独发送请求(即只有在最后一次完成时才发送下一个请求),因为这样会使用户放慢速度。

有没有解决这个会话覆盖或者我应该完全使用完全不同的方法?

谢谢大家!


编辑:
这是检查域的可用性。用户搜索“mydomain”,com,net,org等结果最终呈现。

发送一个请求并让脚本一次搜索所有的tld意味着一个响应不会被返回,直到所有的结果都进入。某些tld的结果似乎需要超过30秒,在此期间用户没有得到任何反馈,除了一个歪曲的图标和“Please Wait”(这是javascript未启用时发生的情况)。

独立请求允许我为他们在显示领域的可用性。

目前我一起发送一个请求的思路思考,然后使用JavaScript的setInterval的反复检查会话,直到所有的结果是。

+0

我觉得我不能评论这个,除非你解释为什么你需要20个AJAX调用每个搜索请求。 – mepcotterell 2008-12-08 12:40:45

+0

你真的需要搜索会话吗? – 2013-04-13 00:36:18

回答

1

请求被并联,这意味着这是类似于并发编程(带螺纹),包括竞争条件等

我的建议是只发送搜索动作(假定用户仅执行一次搜索处理,而不是20)到服务器,sp在你想要它执行的20个动作中点燃它。这可以让你依次执行它们,防止它们互相覆盖。

0

对不起,它不是你真正的答案,但20个请求听起来像一个单一的搜索太多。实施了类似的东西,即。存储在会话中的简短搜索历史记录我们选择不使用AJAX。有一段时间和一个地方,但是如果它会在你的流量增加的时候通过请求来杀死你的服务器,那就不是了。

4

我想你应该开始重构你的解决方案:

  1. 所有性能准则规定,你应该尽量减少HTTP请求的数量。20实在是太多了
  2. 如果你有一个共享的资源,你需要锁定解锁你操纵它的部件,以防止两个或更多的请求,同时更新
0

尝试建立一个请求队列为您阿贾克斯电话。每次电话会在上一次电话结束后进行。

第二次请求发出后,您不能确定会发生什么,因为如您所说,只能发送2个同步请求。该数字第三请求将最有可能取代2号等

0

我认为这是某种自动完成的搜索框。如果您使用的是Scriptaulous'Ajax.Autocompleter,则可以简单地指定一个“minChars”参数。它不会发送AJAX请求,直到至少输入很多字符为止。

您还可以调整'频率'参数,该参数会更改输入字段在更改之前应该轮询的频率(以秒为单位)发射一个AJAX请求。

More details here

0

正如其他人所指出的第一个方法应该是减少请求的数目。如果这不是一个选项,您可以使用子域来增加并行请求的数量。

配置您的DNS(用于说mydomain.com)接受所有子域* .mydomain.com并将它们发送到同一台服务器。

你就可以发送不同的AJAX请求

这种方法使用mapservers如谷歌地图,以增加不同的域(a.mydomain.com,b.mydomain.com,...)浏览器并行下载的地图数量。

0

问题是,在同时请求之间,会话启动。即使它在另一个上下文中打开,由于存储的会话读取和相同的cookie,每个请求打开的会话也是相同的。然后,如果其中一个当前请求首先结束其任务,它将关闭会话,因为它总是在脚本结束其任务时发生,但由于另一个脚本(另一个被调用)可能仍在运行,它不知道该会话已经关闭,所以有一些解决方案。 在结束任务之前,将会话var复制到sessionholder var,重新启动会话,还原seesion值session = sessionholder和session_write_close 哪个会话将首先开始或结束?有时候没有办法知道,也许第一个开始会话将花费更长的时间来结束他的任务,而另一个来来去去,无论如何,照原样,会话只不过是保存一个名为session的变量,类型包含键值的数组,处理恢复存储的值,然后在脚本任务结束时更新这些值的保存,这是会话在这个问题上是自动的,所以如果您启动一个会话没有区别(恢复其存储的值,给它分配新的值,然后再保存它们,这个过程是开始会话,分配值,会话写入关闭。当然,请注意,如果你重新启动一个会话而没有保存它的实际值,它们将会丢失他们存在),所以这就是为什么你必须首先保持其实际值,恢复,重新分配当前值,然后writeclose。PHP所特有的会话变量固有的另一个过程是分配一个引用(会话ID),它将它发送给客户端(通常通过cookie),因此当cookie返回时,该引用ID标识存储的会话变量以恢复以前的值。 请记住,一个相同的调用可能会做同样的事情,因为ajax是异步的,如果由于某种原因一个调用延迟,并且用户再次点击,新的请求将不会结束当前并且会发生同样的问题,所以如果使用ajax根据您的应用程序准备处理会话。 最后,请记住,调用可能是不同的文件,或相同的文件,一个ajax调用请求prices.php其他products.php但两个会使用相同的会话存储变量,会话var只有一个所有时间为你所有的脚本。 Avenida Gez。 感谢您的阅读