当前位置: 首页 > 面试题库 >

使用Ajax和PHP进行长时间轮询-Apache冻结

许毅
2023-03-14
问题内容

我们尝试在我们公司的ERP中实施基于长期轮询的通知服务。与Facebook通知类似。

使用的技术:

  • 在每次循环迭代中,PHP timeout设置为60秒零1秒sleep
  • jQuery用于AJAX处理。
  • Apache作为Web服务器。

经过近一个月的编码,我们开始生产。部署后几分钟,我们不得不回滚所有内容。事实证明,我们的服务器(8个核心)无法处理20名员工的长时间请求,每个服务器都使用约5个浏览器标签。例如:用户使用我们的ERP打开了3个选项卡,每个选项卡上都有一个长期轮询的AJAX。无法打开第4个标签页-
它会挂起,直到杀死前三个标签页之一(因此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。他不知道该怎么办。


问题答案:

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

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

假设我正在AJAX从中获取数据

http://domain.com/ajax

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

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

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

还有的是也有一些问题AJAX Same OriginSecurity,但我们设法解决它,使用上都适当的报头JSPHP两侧。



 类似资料:
  • 问题内容: 我最近在StackOverflow上问了一个有关我的功能的问题,人们建议我使用Ajax Long Polling。我花了几天的时间研究该主题,并尝试编写基本的长轮询代码,但是这些代码都没有起作用,而且我什么也做不了。 这是我的基本功能: 有人能够告诉我如何将其转变为基本的长轮询功能,或者甚至直接指向我需要到达的路径。很感谢任何形式的帮助。谢谢! 问题答案: 通常(即,当不使用长时间轮询

  • 问题内容: 我正在研究ajax长期轮询,但感到困惑。传统的ajax调用和长时间轮询有什么不同 此示例仅以递归方式调用服务器。与setInterval中的传统调用不同。 问题答案: 顾名思义,“ 长时间轮询” 意味着长时间轮询某些内容。 这是实际过程的开始,您对服务器上的某个脚本进行ajax调用,在本例中为,您需要使服务器脚本(例如)足够智能,以便仅在所需数据可用时才响应请求,该脚本应等待指定的时间

  • 问题内容: 我正在尝试在Flask框架下使用JQuery和Python进行长时间轮询。 在PHP中进行了长时间的轮询之后,我尝试以相同的方式进行处理: 具有while(true)循环的脚本/函数,定期检查更改,例如,数据库中每0.5秒更改一次,并在发生更改时返回一些数据。 因此,在我的ini .py文件中,我创建了一个到/ poll的app.route,以供JQuery调用。jQuery向其提供有

  • 问题内容: 我经营一个网站,用户可以在该网站上通过浏览器互相聊天(想想Facebook聊天)。处理现场互动的最佳方法是什么?(现在,我每30秒进行一次民意调查以更新在线用户和新收到的消息,而另一次民意调查则每秒在聊天页面上进行一次以获取新消息。) 我考虑过的事情: HTML5 Web套接字:未使用此功能,因为它不适用于所有浏览器(仅适用于chrome)。 Flash Sockets:没有使用它,因

  • 问题内容: 我正在创建一个自定义查询构建器,当用户创建查询时,他可以通过单击按钮来验证查询语法。当用户单击按钮进行验证时,将通过查询向服务器发送AJAX调用,并开始执行查询,在此期间,用户可以在其屏幕上看到带有取消按钮的模式。如果用户偶然单击了“取消”按钮,我希望向服务器发送另一个AJAX调用以终止查询的执行。 目前,我只能取消最初发送的AJAX调用,并且我的页面在用户端正常运行 但是我正在寻找一