加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 02:51:34 所属栏目:百科 来源:网络整理
导读:我们尝试在公司的ERP中实施基于长轮询的通知服务.与Facebook通知类似. 使用的技术: PHP的超时设置为60秒,并在每次循环迭代中休眠1秒. 用于AJAX处理的jQuery. Apache作为Web服务器. 经过近一个月的编码,我们去了生产.部署后几分钟我们不得不回滚所有内容.事
我们尝试在公司的ERP中实施基于长轮询的通知服务.与Facebook通知类似.

使用的技术:

> PHP的超时设置为60秒,并在每次循环迭代中休眠1秒.
>用于AJAX处理的jQuery.
> Apache作为Web服务器.

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

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

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

有趣的是,它可以在我的本地机器上使用类似的配置.在服务器上,看起来Apache忽略了配置,因为MinSpareServers设置为16,重启后会激活8.你不知道该怎么做.

解决方法

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

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

我们假设我从中获取了AJAX数据

http://domain.com/ajax

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

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

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

有关更多信息,请查看this thread.

AJAX Same Origin Security也存在一些问题,但我们设法在JS和PHP方面使用适当的头文件来解决它.

如果您想了解更多关于标题的信息,请查看here on StackOverflow和here on Mozilla Developer’s page.谢谢!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读