ฉันพยายามใช้การแคช http ในตัวควบคุมของฉันฉันกำลังตั้งค่าการตอบสนองดังนี้:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
โหมด dev
ในสภาพแวดล้อม dev การตอบสนองแรกคือ 200 โดยมีส่วนหัวต่อไปนี้:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
อีก 2 นาทีทุกการตอบกลับคือ 304 โดยมีส่วนหัวดังต่อไปนี้:
cache-control:max-age=120, public, s-maxage=120
นี่เป็นสิ่งที่ฉันคาดหวังไว้
โหมดแยง
ในส่วนหัวการตอบสนองโหมด prod จะแตกต่างกัน โปรดทราบว่าใน app.php ฉันหุ้มเคอร์เนลใน AppCache
การตอบสนองแรกคือ 200 ที่มีส่วนหัวต่อไปนี้:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
ดังนั้นจึงเป็นการตอบกลับแบบไม่แคชส่วนตัว
ทุกคำขอถัดไปเป็นสิ่งที่ฉันคาดหวัง 304 ที่มีส่วนหัวดังต่อไปนี้:
cache-control:max-age=120, public, s-maxage=120
ฉันควรกังวลเกี่ยวกับเรื่องนี้หรือไม่? มันเป็นพฤติกรรมที่คาดหวังหรือไม่?
จะเกิดอะไรขึ้นถ้าฉันวางเซิร์ฟเวอร์ Varnish หรือ Akamai ไว้ข้างหน้ามัน
ฉันทำการดีบักเล็กน้อยและฉันคิดว่าคำตอบนั้นเป็นแบบส่วนตัวเนื่องจากส่วนหัวที่แก้ไขล่าสุด เคอร์เนล HttpCache ใช้ EsiResponseCacheStrategyเพื่ออัปเดตวิธีการตอบกลับที่แคช ( HttpCache :: handle () )
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrategy เปลี่ยนการตอบกลับเป็นแคชไม่ได้หากใช้ Last-Response หรือ ETag ( EsiResponseCacheStrategy :: add ()วิธีการ:
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Response :: isValidateable ()ผลตอบแทนจริงถ้า Last-Response หรือส่วนหัว ETag เป็นปัจจุบัน
มันส่งผลในการเขียนทับส่วนหัวของการควบคุมแคช ( เมธอด EsiResponseCacheStrategy :: update () ):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
ฉันถามคำถามนี้กับกลุ่มผู้ใช้ Symfony2 แต่ฉันยังไม่ได้รับคำตอบ: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
ปรับปรุง
เนื่องจากผมไม่ได้มีการเข้าถึงรหัสเดิมผมพยายามที่จะทำซ้ำสถานการณ์ล่าสุดมาตรฐานฉบับ Symfony
ส่วนหัวการตอบสนองมีความสอดคล้องกันมากขึ้นในขณะนี้ แต่ก็ดูเหมือนว่าจะผิด
ทันทีที่ฉันตั้งLast-Modified
ส่วนหัวของการตอบสนองการตอบกลับครั้งแรกที่ทำโดยเบราว์เซอร์จะมี:
Cache-Control:must-revalidate, no-cache, private
การตอบสนองที่สองมีความคาดหวัง:
Cache-Control:max-age=120, public, s-maxage=120
หากฉันหลีกเลี่ยงการส่งIf-Modified-Since
ส่วนหัวคำขอทั้งหมดจะกลับmust-revalidate, no-cache, private
มา
ไม่สำคัญว่าจะมีการร้องขอในสภาพแวดล้อมprod
หรือdev
อีกต่อไป
app.php
และapp_dev.php
เหมือนกันหรือไม่ (ละเว้นการดีบักและ env)
debug=>true
เป็น getOptions () ใน AppCache เพื่อให้ได้X-Symfony-Cache
ส่วนหัวหรือไม่?