2013-10-13 98 views
0

我試圖使用私人/公共緩存,以避免檢索所有用於構建主頁內容的數據。這是安靜的靜態內容。使用symfony2 http動態緩存動態頭緩存策略

我試着這樣做。

$response->setMaxAge(600); 
    // mark the response as either public or private 
    $response->setPublic(); 
    $response->setPrivate(); 

    // set the private or shared max age 
    $response->setMaxAge(2000); 
    $response->setSharedMaxAge(2000); 
    $response->setETag(md5($response->getContent())); 
    $response->isNotModified($this->getRequest()); 
    // set a custom Cache-Control directive 
    $response->headers->addCacheControlDirective('must-revalidate', true); 

,但我有一個可以真正改變動態語言一樣&貨幣選擇一些小的信息。

如果用戶決定更改語言或貨幣時如何更改內容?

它目前正在爲語言工作,因爲URL是不同的home.site/fr或home.site/en。

但貨幣的信息不在網址中,而其他信息如驗證與否也不在網址中。

那麼如何使用Http緩存並使事情真正符合用戶操作?

感謝您的幫助。

號Yoni

回答

4

使用您有想你的應用程序作爲一個整體HTTP緩存。

根據您的反向代理,默認策略是基於其URI來緩存頁面。 ETag用於發出條件請求以避免從後端獲取實際數據,但不會改變緩存策略的行爲。

因此,使用您當前的設置,每次用戶訪問時,比如說example.net/fr,在定義的2000秒內,無論他選擇哪種貨幣,它都將獲得從後端檢索到的第一個緩存內容。

如果你想優化你的表現,你需要減少刪除不太常見的信息。

在你的情況,你可能會想你的緩存內容的至少2表示:

  1. FR + EUR
  2. EN + EUR

等等。

爲什麼?因爲你不想緩存所有可能的表示,否則你的緩存將變得毫無用處。

爲了使緩存策略更有效率,您需要能夠爲最多的人緩存數據,因此如果您擁有「歡迎{username}」等塊,它將會失敗,因爲您可能必須緩存每個用戶的內容表示,這是錯誤的。

保留某種「Welcome {username}」塊的最好方法是使用ESI,它允許您將佈局分成幾個塊,每個塊使用不同的緩存策略(或者根本不緩存)。

在你的情況下的問題是我敢打賭,貨幣存儲在某種類型的cookie中。默認情況下,大多數反向代理(如varnish)不會使用cookie緩存響應,因爲它可能是一個主要的安全漏洞。

因此,您基本上有兩個解決方案,定義您的自定義策略,使用Varnish或使用HTTP功能(Custom header + Vary)時非常簡單。