Saya mencoba menggunakan caching http. Di controller saya, saya mengatur respons sebagai berikut:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
mode dev
Di lingkungan dev, respons pertama adalah 200 dengan tajuk berikut:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
Untuk 2 menit berikutnya setiap respons adalah 304 dengan tajuk berikut:
cache-control:max-age=120, public, s-maxage=120
Ini pada dasarnya yang saya harapkan.
mode prod
Dalam mode prod, respons header berbeda. Perhatikan bahwa di app.php saya membungkus kernel di AppCache.
Respons pertama adalah 200 dengan tajuk berikut:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Jadi ini adalah respons tanpa-cache pribadi.
Setiap permintaan berikutnya adalah apa yang saya harapkan; a 304 dengan tajuk berikut:
cache-control:max-age=120, public, s-maxage=120
Haruskah saya mengkhawatirkannya? Apakah itu perilaku yang diharapkan?
Apa yang akan terjadi jika saya meletakkan server Varnish atau Akamai di depannya?
Saya melakukan sedikit debugging dan saya pikir respons itu pribadi karena header yang terakhir dimodifikasi. Kernel HttpCache menggunakan EsiResponseCacheStrategy untuk memperbarui respons yang di-cache ( metode HttpCache :: handle () ).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy mengubah respons menjadi non-cacheable jika menggunakan Last-Response atau ETag ( EsiResponseCacheStrategy :: add () metode):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable () mengembalikan true jika Last-Response atau ETag header ada.
Hasilnya menimpa metode Cache-Control header ( EsiResponseCacheStrategy :: update () ):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Saya mengajukan pertanyaan ini pada grup pengguna Symfony2 tetapi sejauh ini saya belum mendapatkan jawaban: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Memperbarui.
Karena saya tidak lagi memiliki akses ke kode asli saya mencoba mereproduksi skenario dengan edisi standar Symfony terbaru .
Header respons lebih konsisten sekarang, tetapi tampaknya masih salah.
Segera setelah saya mengatur Last-Modified
tajuk pada respons, respons pertama yang dibuat oleh peramban memiliki:
Cache-Control:must-revalidate, no-cache, private
Respons kedua diharapkan:
Cache-Control:max-age=120, public, s-maxage=120
Jika saya menghindari pengiriman If-Modified-Since
tajuk, setiap permintaan kembali must-revalidate, no-cache, private
.
Tidak masalah jika permintaan itu dibuat di prod
atau dev
lingkungan lagi.
sumber
app.php
danapp_dev.php
sama? (mengabaikan debug dan env)debug=>true
getOptions () di AppCache sehingga Anda mendapatkanX-Symfony-Cache
tajuk?Jawaban:
Saya menghadapi masalah yang sama. Saya harus menyediakan tajuk 'publik' cdn saya. Secara default ketika caching gateway diaktifkan dalam mode prod, ia mengembalikan 200 OK dengan pribadi, nocache harus memvalidasi header.
Saya memecahkan masalah dengan cara ini.
Di app.php, sebelum saya mengirim respons ke pengguna ($ response-> kirim), saya telah menimpa header kontrol cache menjadi kosong dan mengatur header cache ke publik dan usia maks (nilai tertentu).
// cuplikan kode dari app.php
sumber
Perilaku yang Anda alami dimaksudkan. Symfony2 Docs secara eksplisit menggambarkan situasi ketika privat dan publik digunakan, defaultnya privat .
sumber