5

我想将数据缓存在 broswer 中,这样 broswer 就不需要在几分钟内查询服务器。我添加了 php 缓存标头,但似乎它不起作用。这是我的 ajax 代码和 php 代码: Ajax 代码:

function myAjax(name, callback) {
    var url = './php/getJson.php?name=' + encodeURIComponent(name) + '&callback=?';
    jQuery.getJSON(url, function(data) {
        callback(data);
        jQuery.ajaxSetup({ cache: true });
    });
}

PHP代码:

$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
$lm = gmdate("D, d M Y H:i:s", time() - $seconds_to_cache/2) . " GMT";
header("Last-Modified: $lm");
header("Expires: $ts");
header("Pragma: cache");
header("Cache-Control: public, max-age=$seconds_to_cache");

include_once('getData.php');

$output = $_GET['name'];

echo $_GET['callback'].'('.$output.')';

感谢MitchSlenzai的帮助。这个问题解决了。cache:true选项应该在任何 ajax 查询之前设置,并且旧的 jquery 库不支持缓存。所以请确保您使用的是最新的 jquery 库

对于想要一个工作示例的人:

阿贾克斯代码:

var callback = function(data) {
    alert("callback");
}
function myAjax(name) {
    var url = './php/getJson.php?name=' + encodeURIComponent(name) + '&callback=?';

    jQuery.ajaxSetup({ cache: true });
    jQuery.getJSON(url, function(data) {
        callback(data);
    });
}

PHP代码:

$seconds_to_cache = 3600;
$ts = gmdate("D, d M Y H:i:s", time() + $seconds_to_cache) . " GMT";
$lm = gmdate("D, d M Y H:i:s", time() - $seconds_to_cache/2) . " GMT";
header("Last-Modified: $lm");
header("Expires: $ts");
header("Pragma: cache");
header("Cache-Control: public, max-age=$seconds_to_cache");

$output = '{"eventList":["event1","test event"]}';

echo $_GET['callback'].'('.$output.')';
4

2 回答 2

2

您正在将Last-Modified标题设置为一小时前并将其设置max-age为一小时。

这意味着在您发送此数据时,它已经处于缓存允许的最大期限,并且必须重新发送任何后续请求。

于 2012-11-06T08:41:32.910 回答
0

我根据您的代码编写了一个测试项目。 http://test-lenzai.rhcloud.com/index.html

每次按下按钮,它都会启动一个新的 ajax 请求...查询被发送两次,然后使用浏览器缓存!!!!

这是由 JQuery 引起的:

  • 附加了第一个查询&_=s135227990...(可能是一些时间戳)
  • 随后的查询没有这个额外的参数,所有相同的查询都有效地使用了缓存。

现在的问题是如何调整 jquery 以使第一个和第二个 ajax 查询相同

于 2012-11-07T03:50:35.763 回答