İlk yanıtın AppCache (Symfony2) ile özel olması iyi midir?


140

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-ModifiedYanı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 prodveya devortamda yapılması önemli değil.


3
$ kernel = new AppCache ($ kernel) özelliğini devre dışı bıraktığımda; benim için herkese açık olarak gösterilir. ama sonra her zaman bir kod 200 ile cevap verecektir ... ben revery proxy nginx olarak kullanın.
Michael

sen app.phpve app_dev.phpaynı mısın? (hata ayıklama ve env yoksayılıyor)
Florian Klein

1
Artık bu projeye erişimim yok, bu yüzden bunu doğrulayamıyorum. AppCache etkin denetleyicilerin varsayılan olduğunu hatırlıyorum.
Jakub Zalas

1
@Florian Sorunu yeniden oluşturmayı denedim ve en son Symfony sürümü ile biraz farklı bir davranışım var (bir güncellemeye bakın).
Jakub Zalas

2
Belirlediğiniz misiniz debug=>trueAlacağınız böylece AppCache içinde getOptions () içine X-Symfony-Cachebaşlığı?
denkiryokuhatsuden

Yanıtlar:


9

Aynı sorunla karşılaştım. Cdn'imi 'genel' başlıklara vermek zorunda kaldım. Varsayılan olarak, ağ geçidi önbelleği prod modunda etkinleştirildiğinde, özel olarak 200 OK döndürür, nocache üstbilgileri doğrulamalıdır.

Problemi bu şekilde çözdüm.

App.php'de, kullanıcıya yanıt göndermeden önce ($ response-> send), önbellek denetim başlığının üzerine boş yazdım ve önbellek başlıklarını genel ve maks. Yaş (bazı değer) olarak ayarladım.

// app.php'den kod snippet'i

    $response = $kernel->handle($request);
    $response->headers->set('Cache-Control', '');
    $response->setPublic();
    $response->setMaxAge(86400);
    $response->send();        

Bir denetleyicide herkese açık olmalarına rağmen özel yanıtlar aldınız mı?
Jakub Zalas

Ağ geçidi önbelleğe almayı etkinleştirir ve prod modunda çalıştırırsam evet. Statik içerikler için yukarıdaki çözüme ihtiyacım vardı.
srikanthsatturi

-4

Yaşadığınız davranış amaçlanmıştır. Symfony2 Dokümanlar , özel ve genel kullanıldığında, varsayılan olarak özel olan durumları açıkça tanımlar .


Bu benim durumum değil, üzgünüm.
Jakub Zalas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.