过去我遇到过一些与此非常相似的问题,它们通常总是与缓存有关。而且由于您的 AJAX 请求被缓存,您的 PHP 脚本不再在用户给定的时间间隔内休眠,这就是为什么您看到请求完成得更快的原因。
缓存背景
实际上,您的 Web 服务器将发出三个响应标头来控制 AJAX 资源的缓存方式。这些适用于 HTTP 和 AJAX 请求。为了您的目的,您实际上并不需要了解这些,但了解这些信息总是很好的信息:
- Expires - 此标头告诉浏览器何时需要检索资源的新版本。例如,一张照片或公司徽标可能会将 Expires 标题设置为未来几个月,因为我们不希望这些图像经常更改。另一方面,检索对时间敏感的 CPU 使用数据的 AJAX 请求的 expires 值可能应该为 -1 以确保始终刷新此数据
- Last Modified - 浏览器可以使用它向服务器发送条件 GET 请求。服务器检查资源是否在给定值之后更改,如果是,则返回更新的内容
- 缓存控制- 这允许代理和其他缓存将此资源的副本存储在共享(或非共享)池中,以便更快地访问资源。
jQuery.load() 是如何工作的
jQuery.load() 通过向服务器上的 html 资源发送一个简单的 GET 请求来工作。请记住,jQueryload()
函数是获取数据的最简单方法,而且通常不是数据检索的最佳方法。它旨在成为一种从服务器获取 html 并随后在您选择的 jQuery DOM 元素中填充 html 的快速方法。这是来自文档的片段:
此方法是从服务器获取数据的最简单方法。它大致相当于 $.get(url, data, success) ,只是它是一个方法而不是全局函数,并且它具有隐式回调函数。当检测到成功响应时(即当 textStatus 为“success”或“notmodified”时),.load() 将匹配元素的 HTML 内容设置为返回的数据。这意味着该方法的大多数使用都非常简单。
由于$.load()
主要是一种将 html 插入 jQuery 元素的简单方法,因此 jQuery 库不提供确保您的请求不被缓存的机制。这是合理的,因为如果您只是检索 HTML,我们可以通过缓存这些响应来获得更高的性能,尤其是在它们没有更改并且被频繁轮询的情况下。
在我测试的所有浏览器中,看起来 IE(9) 是唯一一个始终缓存 AJAX 请求的浏览器。查看 Firefox 与 Internet Explorer 中发出的请求之间的区别:
火狐:
![Firefox 中的 AJAX 请求](https://i.stack.imgur.com/IN86p.png)
IE浏览器:
![IE9 中的 AJAX 请求](https://i.stack.imgur.com/1oVyC.png)
请注意来自 IE 的可疑 <1 ms 响应时间。 IE 不会在过期日期之前刷新缓存的内容,也不会在缓存方面区分 HTTP 和 AJAX 请求。我们需要尝试不同的解决方案,以确保每次调用您的 AJAX URL 时都能接收到新数据。
防止 Internet Explorer 缓存 AJAX 请求
有几种不同的方法可以解决 IE 的缓存限制:
- 向查询字符串添加一个随机标记(nonce 值),例如
?token=[timestamp]
. 通过更改每个请求的请求 URL,浏览器将为每个请求存储不同的资源缓存副本,您将确保从服务器获取最新数据。jQuery 通过简单地获取时间戳来创建一个随机值,如下所示:var nonce = ( new Date() ).getTime();
- 使用 POST 而不是 GET 请求。由于 POST 请求旨在发送修改服务器上资源的请求,因此浏览器永远不会缓存它们。
- 发送一个专门禁止浏览器缓存它的 HTTP 响应标头- 这将在您的 cpu.php 中实现。您可以通过更改
$http_response_header
数组轻松地修改它(请参阅此处的文档)
- 使用
jQuery.ajax()
代替jQuery.load()
:您可以使用该选项$.ajax()
指定某些 AJAX 调用以强制刷新。cache: false
甚至更多,您可以通过在 ajaxSetup(): 中进行配置来确保每次刷新所有 AJAX 调用$.ajaxSetup ({ cache: false });
。这与#1 的解决方案基本相同,但无需在您的 javascript 代码中创建 nonce 值。
在所有备选方案中,#4 是最能保留您正在发出的请求类型并且最容易配置的选项。
另一个建议 - 使用window.setInterval()
调用你的replay()
函数是一种设置请求之间等待间隔的简单方法,并且通常在客户端上实现可变长度的睡眠周期比在服务器上更好。