将设置间隔使客户端PC过载


Would setInterval overload the client PC?

我有一个关于在javascript中使用setInterval((的问题。我正在开发一家医院的(PHP/SQL,Ajax(数据库,现在每当进行pateints测试时,它应该在主屏幕上显示一条消息,说"(Pateints Name(的测试结果已更新"。我尝试使用 php 脚本执行此操作,但无法直接从 php 脚本触发事件。现在我为此目的使用 setInterval(( 它运行一个函数,该函数每 10 秒检查一次 pateints 数据库,并在添加新测试时显示消息。

   setInterval(checkAndDisplayNewResults(), 10000);

我的问题是"这是正确的方法吗?它不会使服务器或客户端PC过载吗?如果它不是正确的方法,那么还有什么选择?

永远每

10 秒轮询一次服务器很少是获取更新的正确方法。 对于客户端、服务器和网络来说,效率都非常低。 您应该将轮询间隔恢复到更慢的时间间隔,或者实现更智能的东西,例如服务器推送解决方案。

一种更有效的解决方案是 Comet,它由长时间运行的服务器请求组成,一旦服务器使数据可用,这些请求将返回数据。

HTML5还指定了一个WebSocket接口,该接口允许客户端和服务器在两者之间打开一个套接字,并根据需要以任何一种方式自由发送数据。

我认为你会使服务器过载更多。特别是如果有很多来自不同地方的连接。使用彗星技术可能有助于:

http://www.lightstreamer.com/

http://www.ape-project.org/

这取决于函数的作用,但如果间隔为 10 秒,则很可能不是。不过,您可能应该这样写:

setInterval(checkAndDisplayNewResults, 10000);

问题不在于setInterval(),因为它只是执行代码。

问题在于:

  1. HTTP请求

    在一台 PC 上每 10 秒轮询一次是可以的。但是,如果您有多台 PC 轮询您的服务器,它将占用您的带宽,并且由于多个请求而增加服务器的开销。想象一下,每 10 秒就有一台医院的 PC 轰炸您的服务器。

  2. 浏览器 DOM

    此外,如果这是一个展台应用程序,您还应该担心加载到 DOM 中的项目数。就像在机场"航班时刻表屏幕"中一样,您只需将越来越多的项目添加到列表中即可。如果不删除那些未使用的项目,它将占用内存。

如果使用 setInterval,请确保只设置一次间隔。否则,您可能会获得多个实例。

您可以搜索 websockets,看看这是否适合您

服务器应该每 1 秒处理 10 个请求没有问题,我认为这是不言自明的。

客户端也不会有任何问题。只确保像约瑟夫说的那样摆脱 DOM 元素,否则 RAM 会慢慢填满。

这一切都归结为您有多少客户。请注意,Web服务器可以处理相当多的请求,所以不要害怕使用它。但是你没有提到有多少客户。

如果有很多客户,我唯一想到的是数据库,这个查询有多重?是否应该缓存结果?也许每 5-10 秒一次?

如果使用 AJAX 是最简单的方法,那么我说

去吧:)

作为 jfriend00 答案的补充,我建议寻找另一种解决方案,而不是使用 setInterval 来做你想做的事。

由于某种原因,setInterval被认为是有害的:

  • setInterval忽略错误
  • setInterval不关心网络延迟
  • setInterval不保证执行

您可以查看那里以了解更多信息 http://zetafleet.com/blog/why-i-consider-setinterval-harmful。

如果您真的别无选择,只能使用此技术来检查服务器更新,那么像下面这样的代码会更有效

var timer = null,
    delay = 1000;
function checkAndDisplayNewResults() {
    // do some work
    // when the work is finished, set a timer to call again the function
    timer = setTimeout( checkAndDisplayNewResults, delay );
    // the term "when the work is finished" means in this case, when your AJAX request is finished
    // and not simply at the end of the checkAndDisplayNewResults function
}
// call the function immediately
checkAndDisplayNewResults();

此外,正如 Joseph 所说,请注意此技术可能会给您的应用程序带来的带宽开销。

无论如何,正如其他人指出的那样,还有其他更好的方法可以做到这一点:WebSocket,服务器发送事件,HTTP轮询,AJAX推送,长加载iframe等。您可以查看本文中有关 Web 套接字 http://www.html5rocks.com/en/tutorials/websockets/basics/的介绍,并阅读更多内容以了解如何使用 Web 套接字

是的,这是正确的方式,您别无选择,例如Gmail使用相同的技术向您展示新电子邮件。