2011-03-20 62 views
1

在执行两个非常简单的ajax POST请求(成功)时,Apache服务器似乎总是按照请求的顺序响应,尽管第二个请求需要比第一个请求少得多的处理时间。双核心PC上的Apache/2.2.6(Win32)和多线程

服务器处理Request1所用的时间为30秒。 服务器处理Request2所用的时间为10秒。

 var deferred1 = dojo.xhrPost(xhrArgs1); 
     var deferred2 = dojo.xhrPost(xhrArgs2); 

我希望Apache在我的双核心机器上实现一些“并行化”,这显然不会发生。

当我在一个单独的浏览器中同时执行每个请求,然后工作正常,首先返回Request2。

事实:

  1. httpd.conf中已:ThreadsPerChild的50,50 MaxRequestsPerChild
  2. PHP版本:5.2.5
  3. ,这两个客户端请求在收到大约在同一时间Apache的访问日志的状态,这是预期的。在服务器端
  4. PHP代码是睡眠(30)/睡眠(10)

为什么我在同一个浏览器中运行时不会获得“并行”知不知道这样简单的事情?

感谢

+0

是的,我做的。也是Zend框架。 – 2011-03-20 12:06:29

+0

对不起,我在你回答了:-(重新发布它,以便您的评论是不是断章取义的确切同时删除了我的意见:如果你使用的会议我问 – 2011-03-20 12:08:53

+0

FWIW,只是想指出两件事情,你可能不知道关于两行JS的你贴。(1)'dojo.xhrPost'不是构造函数,所以你不应该使用'new'关键字之前。(2)这两个请求将因为XHR在默认情况下是异步的 – 2011-03-21 04:05:14

回答

1

当你的两个请求来自同一浏览器发送的,他们都共享同一个会议

当会话存储在文件中(这是默认),有是所使用,以确保在同一时间两个脚本不会使用同一个会话锁定mecanism - 允许,可能会导致第一个脚本的会话数据被第二个脚本覆盖。

这就是为什么第一个完成之前,你的第二个脚本不启动:它等待锁(由第一脚本创建)的会话数据被释放。


欲了解更多信息,看一看的session_write_close()手册页 - 这可能是你的问题的解决方案:

会话数据:sleep()(报价)之前关闭会话通常存储后 脚本终止而不 需要调用session_write_close(), 但会话数据被锁定 防止并发写入只有一个 脚本可以在任何 时间的会话上操作。
当将框架集 与会话一起使用时,您将通过 体验由于此锁定而加载的框架之一 。
您可以 降低尽快 所有更改会话变量 完成结束会话加载所有 帧所需的时间。

+0

嗨帕斯卡,它完美的工作。非常感谢 – 2011-03-20 12:20:17

+0

不客气: -) 玩的开心 ! – 2011-03-20 12:21:08

0

浏览器通常对同一站点有两个连接的限制(尽管您可能会在某些浏览器中增加此限制)。有些浏览器会保留一个用于下载图片等内容的连接,另一个连接用于XHR。这意味着您的两个XHR电话实际上会以相同的连接一个接一个地进行。

您的浏览器将在每次调用XHR后立即返回,因为它们是异步的,但内部很可能只是批了请求。

当你在两个不同的浏览器中运行,显然他们每个人都有两个连接,所以这两个XHR请求在不同的连接出去。这里没问题。

现在,它依赖于浏览器。如果浏览器允许您使用XHR呼叫占用两个连接,那么您最多可以同时运行两个请求。然后它将由服务器决定哪一个先做。

在任何情况下,如果用(或任意数量> 2)同时XHR请求尝试,你不会获得超过2在同一时间上的现代浏览器在服务器上执行。