我目前有几个div来获取单独的页面并每隔x秒刷新一次内容。他们将显示足球比赛的实时比分更新,目前正在播放游戏时每90秒刷新一次,而未玩游戏时则刷新90000秒(以有效地关闭刷新)。
我目前遇到的问题是......
有问题的代码示例是
<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中更改了它。
如前所述,这真的是一个短期修复,因为网站正在重建,所以我真的不介意一个肮脏的黑客,如果需要!
提前致谢
史蒂夫
答案 0 :(得分:3)
在阅读完问题之后,如果我理解你正确面临的问题,那么解决方案就不会出现在jquery部分。解决方案可以在php部分找到。正如您所说,主要问题是服务器由于对matchdetailsbase.php的请求而受到抨击。所以即使你正确地实现了 rcsole 的解决方案,你的php页面仍然会在计时器的每个刻度上被点击,这反过来会运行所有代码并仍然导致你的服务器被锤击。
长期解决方案当然是查询/数据库更改和一些积极的缓存技术的组合。但是既然你提到它是你正在寻找的短期止损解决方案,我建议你选择一些基于php的输出缓存。下面是一些链接,指出您正确的输出缓存方向。
http://php.dzone.com/news/php-caching-pages-with-output-
基本理论是,将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
,否则刷新。
修改:这可能与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>
这对你有意义吗?可能不正确。不确定。