为什么apache不会同时处理来自同一浏览器的多个请求

时间:2010-09-02 02:34:50

标签: php http apache2 xmlhttprequest

我不太确定如何正确地表达这个问题,所以我将从遇到的情景开始。

我在我的网络应用程序中进行了一些处理,这比我希望用户等待再次控制页面的时间更长,所以我决定让它由ajax请求处理。

问题是,即使我将此请求卸载到ajax请求中,似乎apache也不会处理任何进一步的请求,直到原始处理器请求完成为止。

我原本想知道如何解决这个问题,但从那时起就认定这可能是一个坏主意。

但是,如果有人知道为什么apache会以这种方式运行,以及什么(如果有的话)配置指令控制它,我仍然很好奇。我最初的想法是KeepAlive,但禁用似乎并没有改变行为。

我正在通过mod_php运行php,如果这有所不同。

我感谢任何帮助指向正确的方向!

3 个答案:

答案 0 :(得分:11)

您使用的是基于文件的会话吗? PHP将锁定每个请求的会话文件,并保持该锁定,直到您执行session_write_close()或脚本终止/退出。这样做的副作用是所有请求都变为串行,因为它们都争用相同的单一资源(会话文件)。

答案 1 :(得分:2)

我确定这是会话文件。我也有同样的问题。我运行一个很长的请求,例如PHPMyAdmin SQL插入,需要花费几分钟来处理。在处理过程中,我尝试在同一个浏览器中打开一个新标签,然后转到我网站上的任何页面,直到最初的PHPMyAdmin请求完成后才会出现。 如果我在Chrome浏览器中打开一个隐身窗口,它是相同的浏览器,它可以正常工作。如果我在任何其他浏览器中打开网站,那很好。 所以它可能是基于文件的会话,这是PHP的默认值。

其他人提到过去memcached。您还可以在数据库中保存会话。 在不得不去memcached之前,你可以在开始时做所有基于会话的东西。将会话变量复制到临时变量中,以便关闭它然后关闭它。然后,如果您需要稍后设置会话值,请打开它并进行更改,然后快速关闭它。

答案 2 :(得分:0)

你能指出它是apache的证据吗?除非你的apache设置不是最佳的,否则很可能你的页面等待是其他的,也许你已经将你的ajax调用设置为非异步