【问题标题】:why setinterval slows down the website为什么 setinterval 会减慢网站速度
【发布时间】:2012-11-23 22:15:22
【问题描述】:

我正在使用这个简单的功能,但它会根据网页打开的时间使网站倾斜很多。当用户刷新或转到另一个页面时,刷新需要很长时间。

我基本上是在为用户提供新帖子。所以时间必须继续运行。

如果我不使用此功能,则网页加载速度很快。虽然这是一个简单的功能 请帮助或建议任何替代方法。

$(document).ready(function() {
   setInterval( "timer();", 1000 );
});

function timer(){
    $.post('sendchat2.php', {option:'timer',id= $('#timer').val()}, function(data) {
        $('#timer').html(data);

    })
}

【问题讨论】:

  • 这与您使用的浏览器有关。是哪一个?
  • “虽然这是一个简单的函数”。我们不知道data 是否包含一个 10mb 的 html 文件。您需要发布一些更相关的代码。
  • 每一秒你都在向服务器发出一个 POST 请求。您的服务器只有时间处理(响应)(或不响应)并且已经再次请求。你应该重新考虑你的方法。
  • @AugustoMen 我已经在 chrome 和 mozila 上测试过
  • 使用 setInterval 并发布一个 php 文件以每秒获取更新不是一个好方法。我建议使用彗星/长轮询方法。

标签: php jquery


【解决方案1】:

这就是我的做法:

$(function () {

    var $timer = $ ( '#timer' );

    (function timeout () {
        $.post( 'sendchat2.php', { option: 'timer', id = $timer.val() }, function ( data ) {
            $timer.html( data );
            setTimeout( timeout, 1000 );  
        });            
    }());

});

因此,您启动 Ajax 请求,等待响应,将其注入 DOM,然后 然后 启动一秒超时,重复整个过程。


一般模式:

(function f () {

    async(function () {

        // do work here

        setTimeout( f, delay );

    });

}());

所以,函数f 执行一些异步操作(例如 Ajax 请求)。该操作的回调函数执行一些工作(例如,将 Ajax 响应放入 DOM),并在最后设置一个计时器,该计时器在给定延迟后调用 f 函数。

【讨论】:

  • 您或许应该解释一下为什么这是一种更好的方法?我猜我会说在响应回调中添加超时将意味着如果服务器需要一段时间来响应,那么它至少不会同时受到新请求的轰炸。
  • @Sime 我基本上是在为用户提供新帖子。所以时间必须继续运行。
  • @CutyPie Ajax 请求可能需要 20 毫秒到 30 秒之间的任何时间。你不能假设它需要不到 1 秒,因此你不能用setInterval 来做。如果您的服务器还活着并且正在运行,我的代码不会让您的更新变慢。顺便说一句,考虑使用 WebSocket 等替代解决方案或其他技术来建立持久连接 - 每秒执行 Ajax 请求并不能很好地扩展(如果您有很多访问者)。
  • @PaulS 我在回答中提供了解释。这个想法是在响应和后续请求之间设置一秒超时,而不是在两个相邻请求之间。 (如果响应到达需要一秒钟,则没有必要立即执行新请求,因为响应是全新的。)
  • @ŠimeVidas 是你编辑的,还是一开始就错过了?
【解决方案2】:

速度变慢不是因为setInterval(),您使用 setInterval 每 1 秒调用一次该函数“计时器”,这应该只会使页面速度减慢 1000(1 秒)。

问题出在$.post(),这是一个Ajax请求,它的作用是,向脚本(php)发送一些信息,然后php处理这些信息产生一些输出,然后再次发送这个输出到第一页,$.post() 将此信息写入您的 $('#timer') 元素中。

所以减速可能是因为:

  • php 脚本是产生延迟的地方
  • sendchat2.php 返回的数据非常大,导致页面加载延迟。

另外,每秒发送一个 ajax 请求不是很健康,php 脚本可能会过载。您可能想在谷歌上搜索推送方法或轮询方法以正确开发聊天

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-30
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多