微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我们尝试在公司的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 StackOverflowhere on Mozilla Developer’s page.谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐