缓存AJAX请求

时间:2009-03-16 13:34:30

标签: php javascript jquery ajax caching

我正在向一个PHP应用程序发送AJAX GET请求,并希望缓存请求返回以供以后使用。

由于我使用GET,因此不同的请求请求不同的URL(例如getHTML.php?page = 2和getHTML.php?page = 5)。

我需要在PHP应用程序中声明哪些标头,以使客户端浏览器以正确的方式缓存请求URL内容?我是否需要在Javascript中声明处理AJAX请求的任何内容(我使用的是jQuery的$ .ajax函数,它有一个缓存参数)?

我如何处理更改内容的修改内容? getHTML.php?page = 2以便客户端不会回退到缓存版本? 将另一个参数添加到GET请求,例如getHTML.php?page = 2& version = 2是不可能的,因为所请求的URL的链接是自动创建的,没有任何检查(最好是我想要的方式)。

当我尝试AJAX请求缓存的请求URL时,浏览器将如何反应? AJAX请求会立即返回成功吗?

由于

威廉

2 个答案:

答案 0 :(得分:9)

在服务器上添加以下标题:

    header("Cache-Control: private, max-age=$seconds");
    header("Expires: ".gmdate('r', time()+$seconds));

$ seconds 具有明显的含义。

另外,检查您的服务器是否不发布其他一些反缓存标头,如Pragma。如果是这样,请添加“Pragma:cache”标题。

答案 1 :(得分:3)

刷新页面后,即使您之前已经请求了内容,您仍然会对内容进行服务器调用。 PHP标题不会帮助你。

我认为您需要的是当前页面中已从服务器请求的内容的客户端缓存机制。

对于此用例,您可以在JavaScript中使用哈希表,并在调用服务器之前进行查询。这将增强用户体验,因为用户不必等待他已经看过的内容的另一个请求。

以下是一个例子:

//placeholder for hash table as cache
var cache = [];

var getPage = function(pageNr){
    if(cache[pageNr]){
        //content is already in cache, use it from there
        handleContent(cache[pageNr]);
    }
    else{
        //object with parameteres sent with GET request
        var params = {};
        params.page = pageNr;

        $.ajax({
          url: "getHTML.php",
          data: params,
          cache: false,
          success: function(response){
            //handle your response here
            handleContent(response);

            //store the response in the cache for later use
            cache[pageNr] = response;
          }
        });
    }
};

现在请求页面将首先查看当前缓存以查看您是否拥有该内容。如果没有,它将使服务器调用并将响应存储在缓存中。

Google Finance

中的新闻滚动时的用户体验类似

请注意,如果刷新页面,此缓存将被删除。

如果对页面进行编辑,您必须使用Maurice Perry的Yahoo Exceptional Performance链接,以确保您的服务器始终返回最新版本的内容。

有关JavaScript中哈希表的更多信息: http://www.mojavelinux.com/articles/javascript_hashes.html