setInterval会重载客户端PC吗?

时间:2012-05-04 07:53:09

标签: php javascript jquery sql ajax

我有一个关于使用setInterval()的问题;在javascript中。我正在开发一个医院(PHP / SQL,Ajax)数据库,现在每当进行专利测试时它应该在主屏幕上显示一条消息,说“(Pateints Name)的测试结果已更新”。我尝试用PHP脚本来做,但没有办法直接从PHP脚本触发事件。现在我正在使用setInterval()来运行一个函数,该函数每10秒检查一次专利数据库,并在添加新测试时显示消息。

   setInterval(checkAndDisplayNewResults(), 10000);

我的问题是“它是否是正确的方法?它不会使服务器或客户端PC过载吗?如果不是正确的方式,那么替代方案是什么?

8 个答案:

答案 0 :(得分:5)

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

效率更高的一个解决方案是Comet,它包含长时间运行的服务器请求,只要服务器提供数据就会立即返回数据。

HTML5还指定了一个WebSocket接口,允许客户端和服务器在两者之​​间打开一个套接字,并根据需要随意发送数据。

答案 1 :(得分:1)

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

http://www.lightstreamer.com/

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

答案 2 :(得分:0)

这取决于功能的作用,但如果是10秒的间隔,则很可能不会。你可能应该这样写:

setInterval(checkAndDisplayNewResults, 10000);

答案 3 :(得分:0)

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

问题在于:

  1. HTTP请求

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

  2. 浏览器DOM

    此外,如果这是一个自助服务终端应用程序,您还应该担心要加载到DOM中的项目数。就像在机场“航班时刻表屏幕”中说的那样,您只需在列表中添加越来越多的项目。如果你不删除那些未使用的物品,它会耗尽记忆。

答案 4 :(得分:0)

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

您可以搜索websockets并查看它是否适合您

答案 5 :(得分:0)

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

客户也不会遇到任何问题。只确保摆脱像Joseph说的DOM元素,否则RAM会慢慢填满。

这一切都归结为您拥有多少客户端。请注意,网络服务器可以处理大量请求,因此不要害怕使用它。但你没有提到有关有多少客户的事情。

如果有很多客户端,我唯一想到的就是数据库,那个查询有多重?结果应该缓存吗?可能每5-10秒?

如果使用AJAX是最简单的方法来实现这一点,那么我说去吧:)

答案 6 :(得分:0)

作为jfriend00's answer的补充,我建议寻找另一种解决方案,而不是使用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();

此外,作为said by Joseph,请注意此技术可能为您的应用带来的带宽开销。

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

答案 7 :(得分:-2)

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