【发布时间】:2013-04-11 10:25:37
【问题描述】:
我们尝试在我们公司的 ERP 中实施基于长轮询的通知服务。类似于 Facebook 通知。
使用的技术:
- 在循环的每次迭代中,
timeout设置为 60 秒和 1 秒sleep的 PHP。 - 用于 AJAX 处理的 jQuery。
- Apache 作为 Web 服务器。
经过近一个月的编码,我们进入了生产阶段。部署后几分钟,我们不得不回滚所有内容。事实证明,我们的服务器(8 核)无法处理来自 20 名员工的长请求,每个员工使用约 5 个浏览器选项卡。 例如:用户使用我们的 ERP 打开了 3 个选项卡,每个选项卡上都有一个长轮询 AJAX。不可能打开第 4 个选项卡 - 它会挂起,直到前 3 个选项卡中的一个被杀死(因此 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。谁不知道该怎么办。
【问题讨论】:
-
虽然不太可能,但在各种浏览器上都实现了limit on maximum persistent connection per server。您可能想测试第四个选项卡是否会挂起任何数量的员工连接。
-
不要休眠锁定 apache/php 线程的页面。您需要增加您的 apache 工作人员等并将所有这些废话线程化。在我的 CRM 平台中,我使用一个简单的文本文件查找每个用户 ID。如果差异> 60,则上次检查的时间戳与现在的时间戳,然后进行轮询,否则什么也不做。将脚本设置为每秒运行一次。
-
在 python 上尝试使用 websocks。
标签: php ajax apache long-polling