基本的Ajax缓存问题

时间:2010-12-31 11:19:10

标签: php jquery ajax caching

我有一个页面,我需要偶尔异步检查服务器,看看页面的状态是否是最新的(基本上是Live或Offline)。您将看到我有一个函数,其中var live在页面最初加载时设置。然后我向服务器发出ajax请求,以检索live的状态是true还是false。我将初始实时变量与新返回的数据json对象进行比较。如果它们是相同的我什么也不做,但如果有不同我应用一些CSS类。我用setTimeout递归运行它(是否有更好的方法来递归执行此操作?)。

我的问题: data.live不会从它运行的初始时间改变,即使它在数据库中发生了变化。我知道我的mysql正在工作,因为它在初始加载时重新调整了正确的值。这似乎是一个缓存问题。

非常感谢任何帮助。

function checkLive() {
    var live = <?=$result["live"]?>;

    $.ajax({
        type: 'get',
        url: '/live/live.php',
        dataType: 'json',

        success: function(data) {
            console.log('checking for updates... current:' + data.live);
            if (data.live == live) {
                return;
            } else {
                var elems = $('div.player_meta, object, h3.offline_message');
                if (data.live == '1') {
                    elems.removeClass('offline').addClass('live');
                } else {
                    elems.addClass('live').addClass('offline');
                }
            }
        }
    });

    setTimeout(function() { checkLive() } ,15000);
} 

checkLive();

3 个答案:

答案 0 :(得分:5)

使用cache option of $.ajax()将缓存断开器附加到URL,如下所示:

$.ajax({
    type: 'get',
    url: '/live/live.php',
    dataType: 'json',
    cache: false,
    //success, etc.
});

如果这还没有解决它......看看firebug,看看是否正在发出请求(确实应该在此之后),如果仍然获得旧值,问题是PHP,而不是JavaScript。


与此问题无关,只是侧面提示:如果您不需要参数,可以跳过匿名函数调用,这个:

setTimeout(function() { checkLive() } ,15000);

可以是:

setTimeout(checkLive, 15000);

答案 1 :(得分:0)

您可以通过向网址添加唯一ID来检查是否存在缓存问题:

url: '/live/live.php',更改为url: '/live/live.php?'+new Date().getTime(),

干杯

-G。

答案 2 :(得分:0)

我认为Nick Craver有正确的回应。

对于问题的另一点是SetTimeout,您可以使用SetInterval()并避免递归调用。但实际上我会使用setTimeout()并在15000时间添加一个因子。将该因子设置为checklive的参数。然后你会有一张支票,它会及时推迟。这将避免自48小时后他仍然在你的页面上的那个人的大量HTTp请求。

大多数情况下,用户可能会定期检查新网页,但是在网页上停留很长时间的人可能并不存在。这是我做过的一段代码。

function checkLive(settings) {
    (...) //HERE ajax STUFF
    setTimeout(function() {
        if ( (settings.reload <2000000000) && (settings.growingfactor > 1) ) {
            checkLive(settings);
            settings = jQuery.extend(settings,{reload:parseInt(settings.reload*settings.growingfactor,10)});
        }
    },settings.reload);
}