Varnish不缓存PHP会话文件(beresp.ttl = -1)

时间:2013-03-01 10:44:02

标签: php varnish

我无法使用PHP生成的Varnish 3.0.2缓存文件来使用会话。我知道默认情况下Varnish不会使用Set-Cookie缓存文件,但我相信我正在删除此标题。

sub vcl_recv {
        # PHP Generated CSS
        if( req.url ~ "^/css/" ) {
                unset req.http.Max-Age;
                unset req.http.Pragma;
                unset req.http.Cache-Control;
                unset req.http.Cookie;
                return(lookup);
        }

sub vcl_fetch {
 if( req.url ~ "^/css/" ) {
     remove beresp.http.Cache-Control;
     remove beresp.http.Pragma;
     remove beresp.http.set-cookie;
 }

 if (beresp.ttl <= 0s ||
     beresp.http.Set-Cookie ||
     beresp.http.Vary == "*") {
            std.log("--------- HIT FOR PASS --------");
            set beresp.ttl = 920s;
            return (hit_for_pass);
 }
 return (deliver);
}

每个PHP请求都会转到hit_for_pass,永远不会被缓存。 TTL值始终为-1。

1 个答案:

答案 0 :(得分:1)

根据此处提供的信息,最可能的原因是后端发送一个Cache-Control响应头,使Varnish将TTL设置为0。

在varnishlog中查找“TTL”日志行,如下所示:

   21 TTL          c 216230930 RFC 600 -1 -1 1362839670 0 1362839669 1362840269 600
   21 TTL          c 216230930 VCL 600 86400 -1 1362839670 -0

第一个记录是Varnish(在vcl_fetch运行之前)决定了TTL的响应头,第二个是在VCL中进行一些修改后的内容。 前三个的顺序是TTL,grace和keep。你只需要担心TTL。在这种情况下是600s / 10分钟。

不需要在recv和fetch中使用return()。只需将逻辑降低到默认的VCL,从长远来看,它将为您节省痛苦。