2009-07-21 22 views
7

Tôi đã có một số hướng dẫn về cách gzip một tệp css mà trong đó bạn tạo một tệp php công khai để bao gồm các tệp css có nén. Vấn đề là tôi không thể làm cho nó để cache các tập tin css của tôi. Tôi đang sử dụng firebug để tham khảo và tôi đã thực sự cố gắng sử dụng cùng một mã để nén một số javascript và nó lưu trữ nó tốt.Caching gzipped css

Đây là mã:

 
if(extension_loaded('zlib')){ 
ob_start('ob_gzhandler'); 
} 
$offset = 60 * 60 * 24 * 31; 
header('Content-type: text/css'); 
header ('Cache-Control: max-age=' . $offset . ', must-revalidate'); 
header ('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
ob_start("compress"); 
function compress($buffer) { 
    // Remove Comments, White Space, End ;'s 
    $buffer = preg_replace('#/\*.*?\*/#s', '', $buffer); 
    $buffer = preg_replace('/\s*([{}|:;,])\s+/', '$1', $buffer); 
    $buffer = preg_replace('/\s\s+(.*)/', '$1', $buffer); 
    $buffer = str_replace(';}', '}', $buffer); 
    $buffer = str_replace(' {', '{', $buffer); 
    return $buffer; 
    } 

    include('global.css'); 

    if(extension_loaded('zlib')){ 
    ob_end_flush(); 
} 

Sau đó tôi chỉ đơn giản là tham khảo tập tin php của tôi như là một tài liệu css trên các trang khác. Như bạn có thể thấy tôi đã thử thêm độ tuổi tối đa vào danh sách kết hợp cũng chứng minh là không thành công.

Dưới đây là các tiêu đề phản ứng

 
Date  
Tue, 21 Jul 2009 19:59:19 GMT 

Server 
Apache/1.3.41 (Darwin) PHP/4.4.9 

X-Powered-By  
PHP/4.4.9 

Cache-Control 
max-age=2592000, must-revalidate 

Expires 
Thu, 20 Aug 2009 19:59:19 GMT 

Content-Encoding  
gzip 

Vary  
Accept-Encoding 

Keep-Alive 
timeout=15, max=93 

Connection 
Keep-Alive 

Transfer-Encoding 
chunked 

Content-Type  
text/css 

Có điều gì tôi đang mất tích, hoặc một cách tốt hơn để đi về việc này?

Cảm ơn,

EDIT:

Một kịch bản có khả năng dò hay không tập tin đã được thay đổi & gửi 304 nếu nó chưa, kết hợp với tiêu đề thích hợp đã giải quyết vấn đề này.

Arthur

Trả lời

7

Hãy thử thêm này với tập hợp các tiêu đề: -

$offset = 60 * 60 * 24; 
header('Content-type: text/css'); 
header('Cache-Control: max-age=' . $offset); 
header('Expires: ' . gmdate ("D, d M Y H:i:s", time() + $offset) . ' GMT'); 
header('Last-Modified: ' . gmdate ("D, d M Y H:i:s", time()) . ' GMT'); 

Vấn đề là must-revalidate hướng dẫn trong tiêu đề kiểm soát bộ nhớ cache. Điều này sẽ khiến khách hàng yêu cầu lại css mỗi khi cần và mã của bạn không xử lý cho tiêu đề If-Modified-Since và gửi mã trạng thái phản hồi 304 Chưa sửa đổi.

Cách tiếp cận trên làm giảm khoảng thời gian bộ nhớ cache xuống 1 ngày và loại bỏ lệnh phải xác nhận lại. Nó cũng thêm tiêu đề Last-Modified (bộ nhớ cache có thể chọn không cache một mục khi thiếu một tiêu đề Last-Modified hoặc ETag).

Để cải thiện điều này, bạn có thể tìm thấy thời gian sửa đổi cuối cùng thực tế của tệp css mà bạn đang nén và gửi đó làm tiêu đề Sửa đổi lần cuối. Bạn có thể bao gồm trong mã của bạn so sánh các yêu cầu If-Modified-Since tiêu đề với giá trị của các tập tin css thời gian sửa đổi lần cuối. Nếu bạn thấy họ gửi cùng một bộ tiêu đề này nhưng cũng gửi trạng thái 304 Chưa được sửa đổi và không gửi nội dung nào cả. (Tôi không thực sự là một người PHP vì vậy tôi sẽ để lại cho các chuyên gia PHP để đặt trong một câu trả lời khác).

Thực hiện đánh giá thực tế về thời gian bạn muốn một bộ nhớ cache khách hàng css trước khi nó phải thực hiện một nỗ lực khác để lấy nó và thiết lập giá trị độ tuổi tối đa cho phù hợp.

+0

Hey Anthony, Tôi đã thử thêm Sửa đổi lần cuối như bạn đã đề xuất với sự kết hợp của ngày sửa đổi sau đó và trước đó mà không có may mắn. Tôi cũng đã gửi tiêu đề thông qua với một ETag & Nếu sửa đổi kể từ, và nó vẫn không bộ nhớ đệm ... Cảm ơn bạn đã phản hồi, tôi sẽ ghi nhớ tất cả những điều này trong tương lai để tham khảo và gỡ lỗi trong tương lai. – askon

+0

@askon: Đó không phải là yếu tố quan trọng, vấn đề chính là bạn đưa vào chỉ thị phải xác thực lại trong tiêu đề Bộ nhớ cache-Kiểm soát. Sử dụng điều đó có nghĩa là css sẽ luôn được tìm nạp lại. Ngoài ra, bạn có đang sử dụng làm mới trang (F5) trong thử nghiệm của mình không? Điều đó sẽ không chứng minh bất cứ điều gì, các tài nguyên như css được nạp lại theo ngữ cảnh làm mới và không có một cơ chế 304 được tích hợp vào mã của bạn, điều này sẽ dẫn đến việc tìm nạp hoàn toàn tài nguyên. – AnthonyWJones

+0

Xin lỗi tôi nên cụ thể hơn một chút. Tôi đã xóa dòng phải xác thực lại, đây là phản hồi tiêu đề của tôi: http://freetexthost.com/zqbddbchvz Điều tôi không hiểu là tôi có thể thử cùng một tập lệnh ngoại trừ một văn bản/javascript tài liệu và nó cho thấy 200 và lưu trữ nó. – askon

-1

Nếu bạn đọc Python/Django, bạn có thể đọc các mã cho django compressor. Nó đặt nhiều tệp CSS thành một. Phần CSS trông giống như nó khởi chạy CSSTidy để dọn dẹp CSS.

+0

2014-12-03: Hey, @downvoter, cảm ơn bạn đã dừng lại và đưa ra suy nghĩ của bạn về câu trả lời 5 năm rưỡi. – hughdbrown