2011-03-29 91 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(); 

然後,您可以添加頁眉設置緩存控制公衆。使用上面的三行將啓用緩存。