【问题标题】:Symfony 1.4: How do I get caching working with ajax requests?Symfony 1.4:如何使用 ajax 请求进行缓存?
【发布时间】:2011-03-10 15:28:42
【问题描述】:

我有一些要在 ajax 请求中使用的操作。

如果我在浏览器中查看页面,响应会按原样缓存。但是,在 ajax 请求中却不是。

请求方法是 GET 并且没有 GET 参数。

sfViewCacheManager 甚至不调用 isXMLHttpRequest() 所以这很令人困惑为什么这不起作用......

是否有启用缓存 ajax 请求的设置?

【问题讨论】:

  • 怎么知道ajax响应没有被缓存?您确定使用 GET 方法调用请求吗?
  • 你确定它没有 GET 参数吗?一些 JS 库会为您添加一个缓存清除参数,即使您没有为它们指定参数。我们可以看看你的代码吗?另外,做什么,例如Firebug,请告诉您请求和响应标头?
  • 在您的操作的缓存配置中尝试将 with_layout 指令更改为 false。我不确定,但是 ajax 响应如何没有布局可能是个问题。看这个:symfony-project.org/jobeet/1_4/Doctrine/en/…

标签: ajax caching symfony1


【解决方案1】:

在缓存 jQuery 自动完成响应时,以下内容对我有用:

  • 从 jQuery 脚本中移除额外的时间戳参数

    替换:

    var extraParams = {
      timestamp: +new Date()
    };
    

    作者:

    var extraParams = {};
    
  • 在 cache.yml 中启用缓存,带有布局。如果没有布局,它似乎不起作用:

    loginFacility:
      enabled:     true
      with_layout: true
      lifetime:    86400
    
  • 删除操作中的 Pragma 标头,因为它已自动设置为“no-cache”:

    $this->getResponse()->setHttpHeader("Pragma", "");
    

我的操作现在看起来像这样:

public function executeLoginFacility(sfWebRequest $request)
{
  $this->getResponse()->setContentType('application/json');
  $this->getResponse()->setHttpHeader("Pragma", "");
  $facilities =  Doctrine_Core::getTable('Facility')->findLoginFacilitiesForAutocomplete(
        $request->getParameter('q'),
        $limit);

  return $this->renderText(json_encode($facilities));
}

现在,当执行大量自动完成时,Symfony 会缓存响应,而 firefox 会从自己的缓存中检索它们。至少在 Firebug 中是这样的。

我发现向组合中添加模板而不是从操作中返回海峡只会导致 Symfony 缓存中的缓存文件更大。我看不到好处。

【讨论】:

    【解决方案2】:

    这不是 100% 理想的,但我已经想出了一个解决方案。似乎缓存仅在您使用模板时才默认起作用。我是通过return $this->responseText($json);回复的。

    通过一个最小的 PHP 模板响应让缓存运行。

    #jsonSuccess.php
    <?php echo $json ?>
    

    如果有办法让 responseText 触发缓存机制仍然会很高兴,因为它比通过模板运行要快一些。

    有趣的是,缓存现在甚至可以在使用 GET 查询参数时工作。我认为这可能是他们在 Symfony 1.3/1.4 中启用的功能。

    为了知道缓存了什么,我在调试模式下查看时在响应中添加了一个“created_at”标头。

    【讨论】:

      【解决方案3】:

      当 POST 或 GET 或其他 HTTP 标头与页面一起发送时,Symfony 总是禁用缓存。

      因此,您的 AJAX 查询没有被缓存,因为您将 GET 参数发送到要缓存的页面。

      最好的测试方法是:添加GET参数并按照你所说的“在浏览器中”查看页面,你会发现缓存不起作用。

      所以从 Ajax 调用和缓存中禁用 POST 和 GET 或其他 Header PUT DEL 将正常工作。

      禁用Get/Post : http://www.panteo.net/article/en/1/developpement-symfony-php/cache-symfony-and-appels-ajax.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-08
        • 2010-10-13
        • 2019-02-06
        • 1970-01-01
        相关资源
        最近更新 更多