缓存AJAX请求

Wil*_*lem 8 javascript php ajax jquery caching

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

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

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

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

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

谢谢

威廉

san*_*mai 9

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

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

$秒,具有明显的意义.

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


Raz*_*man 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;
          }
        });
    }
};
Run Code Online (Sandbox Code Playgroud)

现在请求页面会首先在当前缓存中查找是否有内容。如果没有,它将让服务器调用并将响应存储在缓存中。

类似于在Google 财经中滚动浏览新闻时的用户体验

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

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

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