我使用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 。有什么办法可以“刷新”输出,还是我做错了?
答案 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秒钟以上的时间,那么其他请求将同时发送,这将使服务器的运行速度进一步降低。...