2011-03-29 90 views
4

我是新来的清漆缓存,并有一个问题,我希望我可以得到一些帮助。清漆缓存没有缓存与会话PHP除非后端TTL改变

我有一个非常简单和基本的设置,但它不工作,因为我明白 它应该由于某种原因。

这与Varnish没有缓存正在使用cookie的PHP页面有关。

这里是我的设置:

1)对于我default.vcl我有一个简单的后端

backend default { 
.host = "127.0.0.1"; 
.port = "80"; 
} 

2)我有只有这两条线段一个简单的PHP文件:

session_start(); 
echo time(); 

3) 当我打电话给这个页面时,它正确不会缓存 ,因为我没有在所需的vcl规则中添加

4)

所以按我的文档的理解我在这两个规则

sub vcl_recv { 
unset req.http.Cookie; 
return (lookup); 
} 

sub vcl_fetch { 
unset beresp.http.Set-Cookie; 
return(deliver); 
} 

5)添加 PHP的页面仍然将不缓存。 我可以看到Set-Cookie标题已被 删除,因为我在FireFox中使用FireBug。

这只是如果我添加此子vcl_fetch 的PHP将缓存:

set beresp.ttl = 24h; 

我的问题是这是正确的?

我不认为我需要改变后端响应的ttl 。我认为只是不想设置 cookie会强制PHP w /会话缓存。

我的完整的默认VCL是:

backend default { 
.host = "127.0.0.1"; 
.port = "80"; 
} 

sub vcl_recv { 
unset req.http.Cookie; 
return (lookup); 
} 

sub vcl_fetch { 
unset beresp.http.Set-Cookie; 
set beresp.ttl = 24h; 
return(deliver); 
} 

我的启动命令是:

varnishd -f /etc/varnish/default.vcl -s malloc,128M -T 127.0.0.1:2000 -a 0.0.0.0:8080 

我打电话的网址是:

http://vbox.local:8080/varnish-tests/index.php 

我的index.php文件有只有:

<?php 
session_start(); 
echo time(); 

我想问问社区如果这看起来正确 或如果我错了。本质上,我只是不确定为什么我有 添加beresp.ttl = 24h最终有页面缓存 在清漆。

我以为我不需要这个。

任何建议非常感谢。

谢谢!

亲切的问候。

+0

这符合我的经验 - 我已经设置了我想要清漆缓存在我的VCL中的任何东西的ttls。如果你不给它一个ttl,你会期望清漆能够缓存多久? – 2011-03-29 02:06:58

+0

嘿,弗兰克。您的评论非常有意义。我只是不确定,因为我没有注意到有关设置与缓存cookie相关的beresp.ttl的文档中的任何内容。也许我在文档中记录了这一点。我花了30多分钟的时间挠挠我的脑袋,直到我想出了它。再次感谢。 – Jacob 2011-03-29 02:10:43

+0

缓存处理会话的PHP响应时需要注意的事项:PHP默认* * [发送反缓存标题](http://us2.php.net/manual/en/function.session-cache-limiter。 PHP)。如果Varnish服从这些标题,如果您期待特定的缓存行为(一旦您解决了当前的问题,这完全不相关),则可能会遇到困难。 – Charles 2011-03-29 02:14:36

回答

1

你应该仔细看看PHP发送给Varnish的标题(例如,通过直接访问你的服务器而不是通过varnishd)。如果标题表示内容无法缓存,则不会。如果他们没有说它可以被缓存,它就不会 - 我怀疑这就是为什么Varnish只是在手动设置ttl时才缓存,因为标题没有“expires”或“max-age ”。

1

获取varnish缓存响应的最简单方法是添加缓存控制头。

PHP:

header('Cache-Control: public, s-maxage=60'); 

会告诉清漆缓存60秒的响应。

4

正如ZoFreX所说,这可能是因为您的Cache-Control或Expires标题。

另外请注意,这条规则是有点危险的:

sub vcl_recv { 
    unset req.http.Cookie; 
    return (lookup); 
} 
sub vcl_fetch { 
    unset beresp.http.Set-Cookie; 
    return(deliver); 
} 

如果您的服务器发送的cookie,这可能是因为你需要他们,至少会。 这种规则将完全禁用你的应用服务器的会话管理。

根据您使用会话的原因,您无法缓存内容的每个部分(例如:用户特定的内容)。

0

我有完全相同的问题。当你做一个在session_start,看来PHP注意到这个页面是潜在的动态和有益重置缓存控制头到这一点:

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma:no-cache 

清漆的默认配置遵循由阿帕奇/ PHP发送这些缓存指令,意义它不会缓存这些页面。我不是100%肯定可以重写默认配置,只是为了扩展它。

我一直在使用的解决方法是重新设置Cache-Control标头,但请注意,这必须在session_start更改它们之后完成。我还没有测试过它是否也需要在session_write_close之后,但是比对不起更安全。

5

清漆会服从响应上的缓存标题。 PHP将发送缓存控制标头不缓存由deafult

Cache-Control:no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma:no-cache 

你需要禁用这些头,否则将上光油服从,因而不缓存页面的响应。要关闭它们只是调用session_cache_limiter()为空字符串

session_cache_limiter(''); 
header("Cache-Control: public, s-maxage=60"); 
session_start(); 

然后,您可以添加页眉设置缓存控制公众。使用上面的三行将启用缓存。