我有一个电子商务应用程序,我尝试设置缓存 - 最初通过的Symfony2反向代理,但后来最终通过光油生产。 我使用的Apache2的Symfony 2.1.8。
我的问题是我不能让ESI标签进行重新检查每一个请求时,主控制器动作被缓存(像购物篮内容的私人内容很重要),但我不明白为什么。
例如,我缓存用下面的代码的网页:
public function indexAction(Request $request)
{
// check cache
$homepage = $this->getHomepage();
$response = new Response();
$response->setPublic();
$etag = md5('homepage'.$homepage->getUpdated()->getTimestamp());
$response->setETag($etag);
$response->setLastModified($homepage->getUpdated());
if ($response->isNotModified($request))
{
// use cached version
return $response;
}
else
{
return $this->render(
'StoreBundle:Store:index.html.twig',
array(
'page' => $homepage
),
$response
);
}
}
所呈现的模板延伸,它包括以下ESI以显示篮基座布局模板:
{% render 'PurchaseBundle:Basket:summary' with {}, { 'standalone': true } %}
(编辑:阅读迭戈的回答后,我还使用了推荐的语法:
{% render url('basket_summary') with {}, {'standalone': true} %}
不幸的是这并没有什么不同。)
我一直在玩的篮子总结了不少的代码,但是这是我目前。
public function summaryAction()
{
$response = new Response();
$response->setPrivate();
$response->setVary(array('Accept-Encoding', 'Cookie'));
if ($this->basket->getId())
{
$etag = md5($this->getUniqueEtag());
$response->setLastModified($this->basket->getUpdated());
}
else
{
$etag = md5('basket_summary_empty');
}
$response->setETag($etag);
if ($response->isNotModified($this->request))
{
// use cached version
return $response;
}
else
{
return $this->render(
'PurchaseBundle:Basket:summary.html.twig',
array(
'basket' => $this->basket
),
$response
);
}
}
在除首页(尚未缓存)篮下总结缓存的工作就好了其他页面,它总是显示正确的数据。 当您返回到你会看到过时的信息的网页这只是。 记录证实, summaryAction
不叫在网页上,除非indexAction
实际上呈现。
编辑
使用error_log($kernel->getLog())
每个页面请求我得到这个对于非缓存页之后:
GET /categories/collections: miss; GET /_internal/secure/PurchaseBundle:Basket:summary/none.html: stale, valid, store; GET /_internal/secure/CatalogBundle:Search:form/none.html: miss; GET /esi/menu/main: fresh
而这对于缓存的网页:
GET /: fresh
我必须失去了一些东西很明显,但文档似乎没有覆盖这一点,但它暗示这只是事情ESI是应该用于排序。