使用Ajax和PHP进行长轮询 – Apache冻结
我们尝试在公司的ERP中实施基于长轮询的通知服务.与Facebook通知类似.
使用的技术: > PHP的超时设置为60秒,并在每次循环迭代中休眠1秒. 经过近一个月的编码,我们去了生产.部署后几分钟我们不得不回滚所有内容.事实证明,我们的服务器(8个核心)无法处理来自20名员工的长请求,每个使用约5个浏览器选项卡. 我们认为,“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.谢谢! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |