2014-03-25 57 views
0

我在我的控制了以下行动:Symfony2的缓存过期

public function popularPlacesAction() 
{ 
    $em = $this->getDoctrine()->getManager(); 

    $query = $em->createQuery(
     "SELECT COUNT(s.id) as total, l.city as name, l.country_code as country_code 
      FROM AcmeMyBundle:Sample s 
      LEFT JOIN s.location l 
      WHERE l.city != '' 
      GROUP BY name 
      ORDER BY total DESC" 
    )->setMaxResults(15); 

    $cities = $query->getResult(); 

    return array(
     'cities' => $cities 
    ); 
} 

我想使用高速缓存设置为响应到期日,如果查询的结果已经改变并不重要。我只是想将响应设置为公开并每小时刷新一次响应,例如。如何在响应来自缓存时执行此操作而不执行原则查询?

回答

3

您需要使用一些缓存方法(可能是Varnish或symfony的反向代理),然后将一些缓存标头设置为您的操作响应。看看这里: Expiration with the Cache-Control Header 例如:

public function popularPlacesAction() 
{ 
    ... 
    $response = new Response(); 
    $response->setSharedMaxAge(3600); 
    $response->setContent(....); 
    return $response; 
} 

希望这有助于。其他文档阅读: HTTP Cache

+0

谢谢你的回答。我不明白这一点的是:如果我想只在缓存的响应过期时才执行doctrine查询,那么将此片段放在我的操作中的何处? –

+1

@YvanL你不需要。反向代理(如清漆)如果仍然有新的响应,则不会向您的应用发出其他请求。 –

+2

阅读:http://symfony.com/doc/current/book/http_cache.html http://tomayko.com/writings/things-caches-do http://www.mnot.net/cache_docs/ –