AJAX,PHP会话和同时请求

时间:2008-12-08 12:34:06

标签: php ajax session

我会直言不讳!

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

我已经读过浏览器只允许同时向服务器发送2个请求。

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

我的第二个(也是更烦人的)问题是同时处理的2个请求似乎相互重写,以便当所有响应完成时,只有一半在会话数组中。无论是奇数还是偶数都取决于最终请求是奇数还是偶数。

我不希望单独发送请求(即只在最后一次发送完成后发送下一个请求),因为这样可以减慢用户的速度。

是否存在覆盖此会话的解决方案,或者我是否应该使用完全不同的方法?

谢谢大家!

<小时/> 编辑:
它用于检查域可用性。用户搜索“mydomain”,最终会显示com,net,org等的结果。

发送单个请求并让脚本一次性搜索所有tld意味着在所有结果都进入之前不会返回响应。某些tld的结果似乎占用了30秒以上,在此期间用户是没有反馈,除了旋涡图标和“请等待”(这是当没有启用javascript时会发生的情况)。

单独的请求允许我在进入时显示域可用性。

我正在考虑发送一个请求,然后使用javascript的setinterval重复检查会话,直到所有结果都在。

8 个答案:

答案 0 :(得分:4)

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

  1. 所有性能指南都规定您应尽量减少HTTP请求的数量。 20太多了
  2. 如果您有共享资源,则需要锁定解锁操作它的部分以防止两个或更多请求同时更新它

答案 1 :(得分:1)

请求是并行处理的,这意味着类似于并发编程(使用线程),包括竞争条件等。

我的建议是将搜索操作(假设用户只执行一次搜索,而不是20次)发送到服务器,并将其分散到您希望它执行的20个操作上。这允许您按顺序执行它们,防止它们相互覆盖。

答案 2 :(得分:1)

http://php.net/manual/en/function.session-write-close.php

将会话中的数据存储在本地变量中,然后调用此函数解锁其他文件的会话。 (虽然必须说20个AJAX调用可能不是最好的解决方案)

答案 3 :(得分:0)

对不起,这不是你真正想要的答案,但是20个请求听起来对于单个搜索来说太过分了。实现了类似的东西,即。存储在会话中的简短搜索历史记录我们选择不使用AJAX。它有时间和地点,但如果它会在您的流量增加时使用请求杀死您的服务器,那就不行了。

答案 4 :(得分:0)

尝试为您的ajax调用构建请求QUEUE。每次通话都将在前一次结束后进行。

在发出第二个请求之后,您无法确定会发生什么,因为您说只能发送2个同时请求。在那个号码之后,第三个请求很可能会取代第二个等等。

答案 5 :(得分:0)

我认为这是某种自动完成的搜索框。如果您使用Scriptaulous'Ajax.Autocompleter,您只需指定“minChars”参数即可。在至少输入了很多字符之前,它不会发送AJAX请求。

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

More details here

答案 6 :(得分:0)

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

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

然后,您可以将不同的AJAX请求发送到不同的域(a.mydomain.com,b.mydomain.com,...)

地图服务器(如谷歌地图)使用此方法来增加浏览器并行下载的地图数量。

答案 7 :(得分:0)

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

相关问题