小编典典

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

ajax

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

使用的技术:

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

经过近一个月的编码,我们开始生产。部署后几分钟,我们不得不回滚所有内容。事实证明,我们的服务器(8个核心)无法处理20名员工的长时间请求,每个服务器都使用约5个浏览器标签。例如:用户使用我们的ERP打开了3个选项卡,每个选项卡上都有一个长期轮询的AJAX。无法打开第4个标签页-
它会挂起,直到杀死前三个标签页之一(因此AJAX停止了)。

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

<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       16
    MaxSpareServers      32
    ServerLimit          50%
    MaxClients          150
    MaxClients           50%
    MaxRequestsPerChild   0
</IfModule>

有趣的是,它可以在具有类似配置的本地计算机上运行。在服务器上,看起来Apache忽略配置,因为MinSpareServers设置为16时,它在重启后启动8。他不知道该怎么办。


阅读 232

收藏
2020-07-26

共1个答案

小编典典

在上一篇文章的第一条评论中,Passerby给了我很好的指导,以检查我们是否达到了与一台服务器的最大浏览器连接。

事实证明,每个浏览器都有这些限制,并且您无法更改(据我所知)。我们采取了一种解决方法以使其正常工作。

假设我正在AJAX从中获取数据

http://domain.com/ajax

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

http://31289.domain.com/ajax
http://43289.domain.com/ajax

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

还有的是也有一些问题AJAX Same OriginSecurity,但我们设法解决它,使用上都适当的报头JSPHP两侧。

2020-07-26