Http önbellekleme kullanmaya çalışıyorum. Denetleyicimde aşağıdaki gibi bir yanıt ayarlıyorum:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
geliştirme modu
Geliştirici ortamında ilk yanıt aşağıdaki başlıkları içeren 200'dür:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
Sonraki 2 dakika boyunca her yanıt aşağıdaki başlıklara sahip bir 304'tür:
cache-control:max-age=120, public, s-maxage=120
Temelde olmasını beklediğim şey bu.
eşya modu
Ürün modunda yanıt başlıkları farklıdır. App.php dosyasında çekirdeği AppCache içine aldığımı unutmayın.
İlk yanıt aşağıdaki başlıklara sahip 200'dür:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Bu, önbelleksiz özel bir yanıttır.
Her sonraki istek hemen hemen olmasını beklediğim şeydir; aşağıdaki başlıklara sahip bir 304:
cache-control:max-age=120, public, s-maxage=120
Endişelenmeli miyim? Beklenen bir davranış mı?
Varnish veya Akamai sunucusunu önüne koyarsam ne olur?
Biraz hata ayıklama yaptım ve son değiştirilmiş başlık nedeniyle yanıtın özel olduğunu anladım. HttpCache çekirdeği , önbelleğe alınan yanıtı güncellemek için EsiResponseCacheStrategy'yi kullanır ( HttpCache :: handle () yöntemi).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy , Last-Response veya ETag ( EsiResponseCacheStrategy :: add () yöntemi) kullanıyorsa bir yanıtı önbelleğe alınamaz hale getirir :
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable () , Last-Response veya ETag üstbilgisi varsa true değerini döndürür.
Bu sonuçlanır Cache-Control başlık üzerine yazarak ( EsiResponseCacheStrategy :: update () yöntemi):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Bu soruyu Symfony2 kullanıcı grubunda sordum ama şu ana kadar cevap alamadım: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Güncelleme.
Artık orijinal koda erişemediğim için senaryoyu en son Symfony standart sürümüyle yeniden oluşturmaya çalıştım .
Yanıt başlıkları artık daha tutarlı, ancak yine de yanlış gibi görünüyor.
Last-Modified
Yanıt için bir başlık ayarladığımda , bir tarayıcı tarafından yapılan ilk yanıtta şunlar bulunur:
Cache-Control:must-revalidate, no-cache, private
İkinci cevap bekleniyor:
Cache-Control:max-age=120, public, s-maxage=120
If-Modified-Since
Üstbilgi göndermekten kaçınırsam , her istek geri döner must-revalidate, no-cache, private
.
İsteğin artık prod
veya dev
ortamda yapılması önemli değil.
app.php
ve app_dev.php
aynı mısın? (hata ayıklama ve env yoksayılıyor)
debug=>true
Alacağınız böylece AppCache içinde getOptions () içine X-Symfony-Cache
başlığı?