【问题标题】:Cache AJAX requests缓存 AJAX 请求
【发布时间】:2010-10-13 14:54:12
【问题描述】:

我正在向 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 请求会立即返回成功吗?

谢谢

威廉

【问题讨论】:

    标签: php javascript jquery ajax caching


    【解决方案1】:

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

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

    $seconds 的含义很明显。

    我们在这里设置了一个Expires 标头,即使如果之前设置了带有max-age 参数的Cache-Control 标头,因为there are clients that do not follow the standard 应该忽略它。

    另外,请检查您的服务器是否没有发出其他一些反缓存标头,例如 Pragma。如果是这样,请添加 Pragma: cache 标头。

    【讨论】:

      【解决方案2】:

      刷新页面后,您仍会为内容进行服务器调用,即使您之前已请求过它们。 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

      【讨论】:

      • 这最终会创建一个相当大的缓存[]。这就是我希望能够使用 PHP Headers 来使用内置浏览器缓存的原因(这可能不会像巨大的 JS 数组那样影响性能。
      • 除非您打算将其用作单个应用程序,否则缓存对象不应变得过大。当它出现时,请记住它仍然存储在客户端上,在用户的浏览器中。在任何情况下,您都可以选择在它达到某个点时冲洗它。
      • 我实际上是在做一个单页的“应用程序”。您确定可以在客户端存储这么大的对象吗?
      • 如果这将作为单个应用程序实现,您可能希望对该哈希有一些配额。在达到一定大小或用户不太可能返回页面时刷新它。
      • 根据您存储在该哈希中的内容,我认为大多数现代浏览器可以处理它通常是安全的,尽管我建议您保持代码整洁并不时清除缓存。
      猜你喜欢
      • 1970-01-01
      • 2014-11-25
      • 2013-12-05
      • 1970-01-01
      • 1970-01-01
      • 2015-01-12
      • 1970-01-01
      • 2014-01-30
      相关资源
      最近更新 更多