将设置间隔使客户端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()
,因为它只是执行代码。
问题在于:
-
HTTP请求
在一台 PC 上每 10 秒轮询一次是可以的。但是,如果您有多台 PC 轮询您的服务器,它将占用您的带宽,并且由于多个请求而增加服务器的开销。想象一下,每 10 秒就有一台医院的 PC 轰炸您的服务器。
-
浏览器 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使用相同的技术向您展示新电子邮件。
- 客户端服务器REST API captcha实现
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 如何使用Socket.io将命令从客户端发送到服务器
- 如何轻松地将服务器端变量从Java代码转移到客户端代码
- Meteor方法在客户端返回null,在客户端运行的相同方法返回正确的值
- 从客户端获取修改后的对象,并将其与服务器上的原始对象组合
- 连接到客户端's PC使用php或JS访问文件
- 引导日期选择器占用客户端PC时间,如何从服务器设置默认时间
- 将设置间隔使客户端PC过载
- 将文件下载到客户端 PC 并回发到页面
- 当Internet连接丢失时,在客户端PC上保存FORM数据
- 保存json字符串到客户端pc(使用HTML5 API)
- 在ASP.NET中的客户端PC上直接打印RDLC报告
- 如何通过脚本将javascript文件从服务器复制到客户端pc
- 通过javascript或jquery获取客户端pc的主机名
- 将文件从服务器文件夹下载到客户端pc
- 获取客户端PC计算机名称或mac地址
- 如何从网络浏览器在客户端PC中存储数据
- 是否可以在客户端PC上创建目录?
- 如何在Page_Load事件中获得客户端PC日期和时间