2011-03-10 119 views
0

我有一些意图在ajax请求中使用的操作。Symfony 1.4:如何获得使用ajax请求的缓存?

如果我在浏览器中查看页面,则响应会被缓存,因为它应该是。但是,在Ajax请求它不是。

请求方法是GET,没有GET参数。

sfViewCacheManager甚至不叫isXMLHttpRequest(),所以它是相当混乱的,为什么这是不工作...

是否有设置某处使缓存Ajax请求?

+0

你怎么知道ajax响应没有被缓存?你确定这个请求是用GET方法调用的吗? – 2011-03-10 17:34:48

+0

你是否确定它没有GET参数?一些JS库会帮助你为你添加一个cache-busting参数,即使你没有为它们指定参数。我们可以看看你的代码吗?另外,例如, Firebug,告诉你关于请求和响应头文件? – 2011-03-10 21:40:54

+0

在您的操作的缓存配置中,尝试将with_layout指令更改为false。我不确定,但如何Ajax响应没有布局,这可能是一个问题。 看这个:http://www.symfony-project.org/jobeet/1_4/Doctrine/en/21#chapter_21_action_cache – Curlas 2011-03-11 11:09:05

回答

0

这不是100%的理想,但我想出了一个解决方案。看起来,只有在使用模板时,缓存才能工作。我通过return $this->responseText($json);回复。

通过最小的PHP模板响应得到缓存运行。

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

如果有一种方法可以让responseText触发缓存机制,因为它会比运行模板稍微快一点。

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

为了说明正在缓存的内容,我在调试模式下查看时为响应添加了“created_at”头。

0

POSTGET或其他HTTP头与页面一起发送时,Symfony始终禁用缓存。

因此,您的AJAX查询未被缓存,因为您正在向要缓存的页面发送GET参数。

测试的最佳方法是:如您所说,在浏览器中添加GET参数和查看页面,您将看到Cache无法工作。

因此禁用POSTGET或其他Header PUT DEL从Ajax调用和缓存将正常工作。

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

1

以下的伎俩,我缓存jQuery的自动完成响应时:

  • 从jQuery脚本中删除另外的时间戳参数

    取代:

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

    由:

    var extraParams = {}; 
    
  • 启用cache.yml缓存,搭配布局。没有布局,似乎没有什么工作:

    loginFacility: 
        enabled:  true 
        with_layout: true 
        lifetime: 86400 
    
  • 删除的动作附注头,因为这是自动设置为“无缓存”:

    $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是retri将它们从它自己的缓存中移出。至少,它在Firebug中看起来如何。

我发现将模板添加到混合中而不是从操作返回strait只会导致Symfony缓存中的较大缓存文件。我看不到任何好处。