PHP的Apache卷曲仅在每个浏览器的每个服务器上打开一个连接

时间:2011-01-21 19:06:24

标签: php apache curl

我在PHP中遇到卷曲问题,我无法弄明白。我有一个Web服务器(Apache),它通过HTTPS在另一台Apache服务器上与Web服务进行通信。我们称它们为“服务器A”和“服务器B”。

我看到的问题是,服务器A每次只使用curl连接到服务器A的每个浏览器的服务器B进行一次连接。我不确定这是否是卷曲或Apache问题。我已经看到几个地方的引用,每个服务器的最大连接设置为curl客户端的一个,但我无法验证它是否存在。

情景:

  • 我在三个不同的浏览器中加载了20个不同的页面,每个浏览器都位于该浏览器中自己的选项卡/窗口中。我同时尝试了Firefox,Chrome和Konqueror。 Firefox通过about:config
  • 显着提高了每个服务器的连接限制
  • 所有这些页面都托管在服务器A上,并且加载时间接近同时开始
  • 服务器A上的每个页面实例使用curl
  • 与服务器B通信
  • 此类型的单次呼叫通常需要~10秒
  • 连接到服务器A的每个浏览器在任何时候只有一个来自A-> B的TCP连接打开(总共3个来自A-> B)
  • 我确认浏览器的多个连接已打开到服务器A

AFAICT请求全部序列化。我能够验证从浏览器到服务器A的多个连接是否已打开,但是每个连接到A的浏览器只能从A-> B打开一个https连接。

服务器B可以同时处理多个连接但由于某种原因,服务器A不会打开到服务器B的多个连接。我尝试从服务器A和B发送“连接:关闭”以查看是否有帮助。它没有。

我发现很多人都在讨论为每个脚本建立多个异步连接,但我想要做的是在不同的页面实例之间打开多个连接到一个外部服务器。

关于问题是什么或如何解决它的任何想法?

2 个答案:

答案 0 :(得分:2)

本机php会话(文件处理程序)使用独占锁定模型 - 一次只有一个进程/线程可以处理特定会话ID的数据。调用session_start()时,执行将阻塞,直到进程可以获取会话文件的锁定。调用session_write_close()时会释放锁定,php会在脚本终止时自动调用。您可以手动调用它以释放锁定并提交更改。如果需要,每个脚本执行可以多次执行session_start()和session_write_close()。

答案 1 :(得分:0)

您是否认为服务器B只允许1个安全连接?

据我所知,这是一个浏览器安全问题,一次只能与同一主机进行1次安全连接。