// app/AppCache.php use Symfony\Bundle\FrameworkBundle\HttpCache\HttpCache; class AppCache extends HttpCache { protected function getOptions() { return array( 'debug' => false, 'default_ttl' => 0, 'private_headers' => array('Authorization', 'Cookie'), 'allow_reload' => false, 'allow_revalidate' => false, 'stale_while_revalidate' => 2, 'stale_if_error' => 60, ); } }
注意,这里无论怎么重写getOptions()方法,其中debug选项将被包裹的AppKernel的debug值自动设置。
下面是一些重要的可选项:
default_ttl: 当没有显式的刷新信息在回复中提供时,一个缓冲实体应该被认为是新鲜的时间秒数。显式的设置Cache-Control 或者 Expires 头会覆盖这个参数值。默认值为0。
private_headers:请求头组,它在回复上触发"private" Cache-Control 行为,无论回复是通过Cache-Control 指令显式的声明是public还是private 。默认为Authorization和Cookie。
allow_reload: 指定是否允许客户端通过在请求中指定Cache-Control的"no-cache"指令来强迫缓存重新加载。设置它为true时符合RFC2616规范。默认值为false。
allow_revalidate:指定是否允许客户端通过在请求中指定Cache-Control的"max-age=0"指令来强迫缓存重新校验。设置它为true时符合RFC2616规范。默认值为false。
stale_while_revalidate:用于指定一个默认秒数(间隔是秒因为回复TTL精度是1秒),在期间缓存还在后台进行重新校验时可以立刻返回一个陈旧的回复(默认是2);该设置会被stale-while-revalidate HTTP Cache-Control扩展重写(RFC 5861)。
stale_if_error: 指定一个默认秒数(间隔是秒)在这期间缓存可以提供一个陈旧的回复当遇到一个错误时。默认值为60。该设置会被stale-if-error HTTP Cache-Contorl 扩展重写(RFC5861)
如果debug设置为true,Symfony2 会自动添加一个X-Symfony-Cache 头到回复保存着关于缓存点击和丢失的信息。
从一个反向代理到另一个的转换:
Symfony2反向代理是一个在开发你的站点或者部署你的站点到一个共享主机而你无法安装任何除PHP代码以外的东西时的非常有用的工具。但是因为使用PHP编写,它不能跟用C写成的反向代理那样快速。这就是为什么我们推荐使用Varnish或者Squid到你的运营服务器上的原因。好消息是从一个代理服务器到另外一个替换很容易,简单的不用你修改任何程序代码。你可以开始时使用Symfony2的反向代理等到了阻塞增加时升级到Varnish。
注意:Symfony2 反向代理执行效率独立于应用程序的复杂性。因为应用程序核心仅仅在请求需要被转发到它时才被启动。
HTTP缓存说明:
为了发挥可用缓存层的优势,你的应用程序必须能传达它的哪个回复可以被缓存,什么时候/怎样 缓存会变成陈旧的规则。这些是通过在回复(response)上设置HTTP 缓存头来实现的。
记住,"HTTP"只不过是一种web客户端和服务器之间交流的简单文本语言。当我们说HTTP 缓存时,我们说的是它允许客户端和服务器交换信息相关的缓存。
HTTP指定了4个Response缓存头,我们需要关注一下:
Cache-Control
Expires
ETag
Last-Modified
其中最重要的也是万能的头是Cache-Control头,它其实是一个各种缓存信息的集合。
Cache-Control Header
Cache-Control头是唯一的一个其内部包含了各种各样的关于一个response是否可以被缓存的信息。每条信息之间用逗号隔开。
Cache-Control:private,max-age=0,must-revalidate Cache-Control:max-age=3600,must-revalidate
Symfony 提供一个Cache-Control头的抽象,使它的创建更加可控。
$response = new Response(); // 标记response为public还是private $response->setPublic(); $response->setPrivate(); // 设置private或者shared 的最大年龄 age $response->setMaxAge(600); $response->setSharedMaxAge(600); // 设置一个自定义的Cache-Control 指令 $response->headers->addCacheControlDirective('must-revalidate', true);
公共vs私有 Response
网关缓存和代理缓存都被认为是“共享”缓存,因为它们缓存的内容是被多用户共享的。如果一个特定用户的回复曾被错误的存储到共享缓存中,它以后可能被返回给无数的不用用户。想象一下,如果你的账户信息被缓存然后返回给每一个后来请求他们自己账户页面的用户。要处理这种情况,每个回复可能都要设置时public还是private。
public 说明给回复可能被private和共享的缓存保存。
private 说明所有的或者部分的回复信息时给一个单独用户的,所以不能缓存到共享缓存中。
Symfony 谨慎地默认每个回复为private。 要使用共享缓存的优点(比如Symfony2反向代理),回复必须被显式的设置为public。
安全方法: