仅在外部内容更改时刷新div

时间:2013-11-16 11:13:54

标签: javascript php jquery

我目前有几个div来获取单独的页面并每隔x秒刷新一次内容。他们将显示足球比赛的实时比分更新,目前正在播放游戏时每90秒刷新一次,而未玩游戏时则刷新90000秒(以有效地关闭刷新)。

我目前遇到的问题是......

  • 在游戏开始之前,我必须仔细检查页面并手动更改javascript计时器并重新上传文件,一旦游戏完成,也会这样做。
  • 即使在90秒,大约有100人经常查看该网站,服务器也会受到一些打击,可能会减速或者只是给出500内部服务器错误。
  • 如果我忘记在比赛结束后将其关闭(或因为我的手机上没有信号而无法关闭),当人们开始回家时,当网站流量增加时,该网站真的需要几个小时的冲击 - 这导致我们的网站锁定几周。

有问题的代码示例是

<script>
 $(document).ready(function() {
     $("#mdetails").load("/content/phppages/matchdetailsbase.php");
   var refreshId = setInterval(function() {
      $("#mdetails").load('/content/phppages/matchdetailsbase.php?randval='+ Math.random());
   }, 90000);
   $.ajaxSetup({ cache: false });
});
</script>

那个来自http://www.margate-fc.com/content/1st_team/fixtures_results/match_detailsnew.php?all_games_id=4733并刷新整个主要内容区域(在“匹配详细信息”下)。在左栏顶部的“匹配”块上有一个类似的。

match_detailsnew.php包含5个不同的查询,因此我在此处查看检查数据库更改的建议很难实现。

不可否认,那段代码是从某个地方复制/粘贴的,因为我对JQuery一无所知,尽管我现在很少在我的学习曲线上。整个网站的设置很糟糕,但这是我4年前第一次尝试在一个充满活力的网站上,我正在从头开始重建它。有了这个,我将熟​​悉轮询数据库的更改并根据它进行刷新。然而,这还有很长的路要走,我们现在迫切需要一个解决方案!!

我想要的是,jQuery检查matchdetailsbase.php的输出是否完全改变(记住这将是由5个查询中的任何一个生成的页面上的任何地方的更改),如果有,则刷新div,假设这不会在服务器上施加与持续刷新相同的应变/页面命中。

如果因为我的设置会出现问题这样做,另一种方法是为刷新时间创建一个变量,我可以在一个地方更改并被所有div识别。我通过在配置文件中设置$ refreshtime = 900然后将脚本更改为

来尝试此操作
 $("#mdetails").load('/content/phppages/matchdetailsbase.php?randval='+ Math.random());
   }, <?php echo $refreshtime; ?>);

这似乎没有什么区别,无论我放在$ refreshtime中,但即使它确实如此,我意识到,因为$ refreshtime超出了刷新的div,所以它不会对它进行任何更改,所以无论如何它是在第一次加载页面时始终保持不变,直到整个页面被手动刷新,即使我在config.php中更改了它。

如前所述,这真的是一个短期修复,因为网站正在重建,所以我真的不介意一个肮脏的黑客,如果需要!

提前致谢

史蒂夫

2 个答案:

答案 0 :(得分:3)

在阅读完问题之后,如果我理解你正确面临的问题,那么解决方案就不会出现在jquery部分。解决方案可以在php部分找到。正如您所说,主要问题是服务器由于对matchdetailsbase.php的请求而受到抨击。所以即使你正确地实现了 rcsole 的解决方案,你的php页面仍然会在计时器的每个刻度上被点击,这反过来会运行所有代码并仍然导致你的服务器被锤击。

长期解决方案当然是查询/数据库更改和一些积极的缓存技术的组合。但是既然你提到它是你正在寻找的短期止损解决方案,我建议你选择一些基于php的输出缓存。下面是一些链接,指出您正确的输出缓存方向。

http://php.dzone.com/news/php-caching-pages-with-output-

Caching HTML output with PHP

基本理论是,将php脚本的输出存储在静态文件中,然后在接下来的x秒内提供文件内容。因此,无论您从客户端调用php脚本多少次,内容每x秒只生成一次。这应该会降低服务器必须处理的处理 - 希望如此。请记住,这只是一个短期解决方案。在你的情况下,我建议将缓存持续时间保持在120-180秒左右。

除了 rscole 的解决方案之外,这应该可以帮助您坚持下去,直到您改进整体设计......

答案 1 :(得分:0)

更新:,因为@fijas指出我的解决方案无法解决服务器锤击问题,因为您仍然会发送请求。这个问题应该在服务器端解决。

来自jquery docs:

$( "#success" ).load( "/not-here.php", function( response, status, xhr ) {
  if ( status == "error" ) {
    var msg = "Sorry but there was an error: ";
    $( "#error" ).html( msg + xhr.status + " " + xhr.statusText );
  }
});

理论上如果页面相同,它应该返回304,对吗?所以我要做的是检查状态是否为304,否则刷新。

http://api.jquery.com/load/

修改:这可能与Refresh div, but only if there is new content from php file

有关

编辑2

<script>
 $(document).ready(function() {
   $("#mdetails").load("/content/phppages/matchdetailsbase.php");
   var refreshId = setInterval(function() {
      $.get({
      url: "/content/phppages/matchdetailsbase.php",
      success: function (data, textStatus, xhr) {
        if (textStatus == "notmodified") {
          pass
        } else {
          $('#mdetails').html(data);
        }
      }
    });
   }, 90000);
   $.ajaxSetup({ cache: false });
});
</script>

这对你有意义吗?可能不正确。不确定。