Tôi đang cố gắng sử dụng bộ nhớ đệm http. Trong bộ điều khiển của tôi, tôi đang thiết lập một phản hồi như sau:
$response->setPublic();
$response->setMaxAge(120);
$response->setSharedMaxAge(120);
$response->setLastModified($lastModifiedAt);
chế độ dev
Trong môi trường dev, phản hồi đầu tiên là 200 với các tiêu đề sau:
cache-control:max-age=120, public, s-maxage=120
last-modified:Wed, 29 Feb 2012 19:00:00 GMT
Trong 2 phút tiếp theo, mỗi phản hồi là 304 với các tiêu đề sau:
cache-control:max-age=120, public, s-maxage=120
Đây là cơ bản những gì tôi mong đợi nó được.
chế độ prod
Trong tiêu đề chế độ prod là khác nhau. Lưu ý rằng trong app.php tôi bọc kernel trong AppCache.
Phản hồi đầu tiên là 200 với các tiêu đề sau:
cache-control:must-revalidate, no-cache, private
last-modified:Thu, 01 Mar 2012 11:17:35 GMT
Vì vậy, đó là một phản ứng không có bộ nhớ cache riêng tư.
Mỗi yêu cầu tiếp theo là khá nhiều những gì tôi mong đợi nó sẽ được; 304 với các tiêu đề sau:
cache-control:max-age=120, public, s-maxage=120
Tôi có nên lo lắng về nó? Đó có phải là một hành vi dự kiến?
Điều gì sẽ xảy ra nếu tôi đặt máy chủ Varnish hoặc Akamai trước nó?
Tôi đã thực hiện một chút sửa lỗi và tôi nhận ra rằng phản hồi là riêng tư vì tiêu đề được sửa đổi lần cuối. HttpCache hạt nhân sử dụng EsiResponseCacheStrategy để cập nhật (trả về từ cache HttpCache :: xử lý () phương pháp).
if (HttpKernelInterface::MASTER_REQUEST === $type) {
$this->esiCacheStrategy->update($response);
}
EsiResponseCacheStrargety biến một phản hồi thành không thể lưu trong bộ nhớ cache nếu nó sử dụng phương thức Last- Feedback hoặc ETag ( EsiResponseCacheStrargety :: add () ):
if ($response->isValidateable()) {
$this->cacheable = false;
} else {
// ...
}
Phản hồi :: isValidatizable () trả về true nếu tiêu đề Phản hồi cuối hoặc ETag có mặt.
Nó là kết quả trong ghi đè lên header Cache-Control ( EsiResponseCacheStrategy :: update () phương pháp):
if (!$this->cacheable) {
$response->headers->set('Cache-Control', 'no-cache, must-revalidate');
return;
}
Tôi đã hỏi câu hỏi này trên nhóm người dùng Symfony2 nhưng cho đến nay tôi vẫn chưa nhận được câu trả lời: https://groups.google.com/d/topic/symfony2/6lpln11POq8/discussion
Cập nhật.
Vì tôi không còn có quyền truy cập vào mã gốc, tôi đã cố gắng tái tạo kịch bản với phiên bản tiêu chuẩn Symfony mới nhất .
Tiêu đề phản hồi hiện nhất quán hơn, nhưng dường như vẫn sai.
Ngay sau khi tôi đặt Last-Modified
tiêu đề cho phản hồi, phản hồi đầu tiên được thực hiện bởi trình duyệt có:
Cache-Control:must-revalidate, no-cache, private
Phản ứng thứ hai có một dự kiến:
Cache-Control:max-age=120, public, s-maxage=120
Nếu tôi tránh gửi If-Modified-Since
tiêu đề, mọi yêu cầu trả lại must-revalidate, no-cache, private
.
Sẽ không có vấn đề gì nếu yêu cầu được thực hiện trong prod
hoặc dev
môi trường nữa.
app.php
và app_dev.php
giống nhau? (bỏ qua gỡ lỗi và env)
debug=>true
getOptions () trong AppCache để nhận X-Symfony-Cache
tiêu đề không?