5

We try to implement long-polling based notification service in our company's ERP. Similar to Facebook notifications.

Technologies used:

  • PHP with timeout set to 60 seconds and 1 second sleep in each iteration of loop.
  • jQuery for AJAX handling.
  • Apache as web server.

After nearly month of coding, we went to production. Few minutes after deployment we had to rollback everything. It turned out that our server (8 cores) couldn't handle long requests from 20 employees, using ~5 browser tabs each. For example: User opened 3 tabs with our ERP, with one long-polling AJAX on each tab. Opening 4th tab is impossible - it hangs until one of previous 3 is killed (and therefore AJAX is stopped).

'Apache limitations', we thought. So we went googling. I found some info about Apache's MPM modules and configs, so I gave it a try. Our server use prefork MPM, as apachectl -l shown us. So I changed few lines in config to look something like this:

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

Funny thing is, it works on my local machine with similar config. On server, it looks like Apache ignores config, because with MinSpareServers set to 16, it lauches 8 after restart. Whe have no idea what to do.

4

2 回答 2

6

前一篇文章的第一条评论中的路人给了我一个很好的方向来检查我们是否达到了与一个服务器的最大浏览器连接。

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

假设我正在AJAX

http://domain.com/ajax

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

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

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

有关更多信息,请查看此线程

也有一些问题AJAX Same Origin Security,但我们设法解决了问题,在两边都使用了适当的JS标题PHP

如果您想了解有关标头的更多信息,请在 StackOverflowMozilla Developer's page 上查看。谢谢!

于 2013-04-19T07:28:06.257 回答
3

我已经成功实现了带有长轮询的 LAMP 设置。有两件事要记住,linux 的 php 内部执行时钟不会被“usleep()”函数改变或增加。因此,只有在获取数据需要比正常时间更长的极少数情况下,或者可能用于 Windows 设置时,才需要设置最大执行时间。此外,考虑到长时间轮询,一旦超过 20 秒,您很容易发生浏览器超时。

其次,您需要验证您的会话没有锁定(如果正在使用会话)。

Apache 真的不应该对你想要做的事情有任何问题。不过,我承认像 nginx 这样的网络服务器或特定于 ajax 的网络服务器可以更好地处理并发连接。如果您可以发布 ajax 处理程序的代码,我们或许能够找出问题所在。

利用子域,或者正如其他线程所建议的那样——不同端口上的多个网络服务器,请记住您可能会遇到 JavaScript 域安全问题。

我说,在遇到问题并用尽所有其他选项之前不要更改 apache 配置;小心 PHP 会话,并确保 AJAX 正在等待响应,然后再发送另一个请求;)

于 2013-09-04T23:27:47.293 回答