使用 Ajax 和 PHP 进行长轮询 - Apache 冻结

ex3*_*x3v 5 php apache ajax long-polling

我们尝试在我们公司的 ERP 中实现基于长轮询的通知服务。类似于 Facebook 通知。

使用的技术:

  • PHP在循环的每次迭代中timeout设置为 60 秒和 1 秒sleep
  • 用于 AJAX 处理的 jQuery。
  • Apache 作为网络服务器。

经过近一个月的编码,我们进入了生产阶段。部署几分钟后,我们不得不回滚一切。事实证明,我们的服务器(8 核)无法处理来自 20 名员工的长请求,每个员工使用约 5 个浏览器选项卡。例如:用户使用我们的 ERP 打开了 3 个选项卡,每个选项卡上都有一个长轮询 AJAX。打开第 4 个选项卡是不可能的 - 它会挂起,直到前 3 个选项卡中的一个被杀死(因此 AJAX 停止)。

“Apache 的局限性”,我们认为。所以我们去谷歌搜索。我找到了一些关于 Apache 的 MPM 模块和配置的信息,所以我试了一下。我们的服务器使用preforkMPM,apachectl -l如图所示。所以我在配置中更改了几行,看起来像这样:

<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       16
    MaxSpareServers      32
    ServerLimit          50%
    MaxClients          150
    MaxClients           50%
    MaxRequestsPerChild   0
</IfModule>
Run Code Online (Sandbox Code Playgroud)

有趣的是,它可以在我的本地机器上使用类似的配置运行。在服务器上,看起来 Apache 忽略了配置,因为MinSpareServers设置为 16,它在重新启动后启动 8。当他不知道该怎么做。

ex3*_*x3v 5

前一篇文章的第一个评论中的路人给了我一个很好的方向来检查我们是否达到了一个服务器的最大浏览器连接。

事实证明,每个浏览器都有这些限制,你不能改变它们(据我所知)。我们制定了解决方法以使其正常工作。

让我们假设我AJAX

http://domain.com/ajax
Run Code Online (Sandbox Code Playgroud)

为了避免达到最大浏览器连接数,每个长轮询AJAX连接到随机子域,例如:

http://31289.domain.com/ajax
http://43289.domain.com/ajax
Run Code Online (Sandbox Code Playgroud)

等等。有从DNS服务器指向一个通配符*.domain.comdomain.com,和子是唯一的随机数,由JS每个选项卡上生成。

有关更多信息,请查看此线程

也有一些问题AJAX Same Origin Security,但我们设法解决了这个问题,在两者JSPHP两侧。

如果您想了解有关标题的更多信息,请在 StackOverflowMozilla Developer's page 上查看。谢谢!

  • 您是说除了浏览器对连接的限制之外,长轮询在您的 apache 服务器上运行良好吗? (2认同)