XMLHttpRequest不会在javascript的间隔内更新

时间:2019-01-18 14:19:20

标签: javascript php ajax xmlhttprequest

我使用AJAX每2秒检查一次用户更新,但是我的JavaScript不会更新响应。

我有一个带有XMLHttpRequest对象的JavaScript文件,并且每2秒将一个请求发送到另一个文件(.php),并在其中获取具有更新的XML。由于某些原因,它并不总是获得最新的内容,并且似乎已经缓存了一些旧的内容。

我的javascript文件包含以下代码(简体):

var updates = new XMLHttpRequest();
updates.onreadystatechange = function(){
    "use strict";
    if(updates.readyState === 4 && updates.status === 200){
        console.log(updates.responseXML);
    }
};

var timer = 0;
clearInterval(timer);
timer = setInterval(function(){
    "use strict";
    updates.open('GET','scripts/check_for_notifications.php', true);
    updates.send();
},2000);

然后我有一个PHP文件( check_for_notifications.php ),其中包含以下代码:

$response = new SimpleXMLElement('<xml/>');

$update = $response->addChild('update');
$update->addChild('content', 'New message');
$update->addChild('redirect', 'some link');
$update->addChild('date', '1.1.2019 12:00');

header('Content-type: text/xml');
print($response->asXML());

每隔两秒钟我会在控制台中收到一个日志,但是当我更改PHP文件时,间隔正在进行中(例如,我将日期更改为'1.1.2019 11:00'并保存了< / i>)我仍然在控制台中收到“ 12:00”。对我来说,它似乎没有更新,并且仍然缓存了 repsonseXML 。有什么办法可以“刷新”输出,还是我做错了?

1 个答案:

答案 0 :(得分:0)

这可能是缓存问题。在网络浏览器控制台中,您应该看到“未修改”类型的响应。

可以肯定的是,您可以在url中添加一个元素以绕过缓存:

updates.open('GET','scripts/check_for_notifications.php&nocache=' + new Date().getTime(), true);

如果这可行,则需要配置服务器(apache或nginx)以防止文件被缓存。它比时间戳解决方案干净。浏览器不会不必要地存储缓存的文件。

Apache .htaccess或Apache conf,类似

<Files "check.php">
    <IfModule mod_headers.c>
        Header set Cache-Control "no-cache, no-store, must-revalidate"
        Header set Pragma "no-cache"
        Header set Expires 0
    </IfModule>
</Files>

Nginx conf,类似

location = /check.php {
    add_header 'Cache-Control' 'no-cache, no-store, must-revalidate';
    expires off;
}

您还可以看到访存api:https://hacks.mozilla.org/2016/03/referrer-and-cache-control-apis-for-fetch/

请注意您的代码,它可以同时启动多个请求,如果用户过多,则可以使用DOS。

如果由于服务器运行缓慢而导致请求花费2秒钟以上的时间,那么其他请求将同时发送,这将使服务器的运行速度进一步降低。...