2010-03-07 16 views
7

CSS dosyam, dosya türünde PHP değişkenlerini kullanabilmem için text/css içerik türüyle sunulan bir PHP dosyasıdır. style.php şuna benzer:dinamik css için önbellek başlıkları (PHP ile oluşturulur)

<?php 
header('Content-Type: text/css'); 
$bgColor = '#000'; 
?> 

body { background:<?php print $bgColor; ?>; } 

beklendiği gibi çalışır, ancak tarayıcı dinamik olarak oluşturulan css dosyasını önbelleğe eğer ben biraz endişeliyim.

Firebug'daki isteklere baktığımda, sayfayı her yüklediğimde tarayıcının style.php yeniden yüklendiğini görüyorum.

Zaten bu önbellek başlıkları eklemek çalıştı:

header('Cache-control: must-revalidate'); 
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + 60 * 60 * 24) . ' GMT'); 

Ama hiç şans. Sayfa her yüklendiğinde dosya hala yüklenir. Tarayıcıyı dosyayı belirli bir süre için önbelleğe almaya zorlamak için uygun başlıklar nelerdir? Bir dosya tarayıcıları tarafından önbelleğe alınmasını istiyorsanız, halka -denetimi başlığını belirlesin

cevap

2

:

header('Cache-control: public'); 

must-revalidate dosyası güncellendi eğer tarayıcı görmek için kontrol anlamına gelir PHP betiğini çağırır.

+5

HTTP/1.1 özelliklerine göre o-validate gerekir demek şimdi bu değil - önbelleğe alınmış içerik bayat hale gelmiştir sonra sona erer direktifleri doğrultusunda sadece (tekme gerekiyordu üstbilgi veya Cache-Control içindeki bir maksimum yaş değeri), ancak bazı tarayıcılar özellikleri göz ardı ediyor ve isteği yine de gönderiyor gibi görünüyor. Bağlantı doğrulanmadıkça 'kamu' gerçekten geçerli değildir. Expires başlığındaki zamanı güçlendirmek için 'Cache-Control: max-age = 86400' kullanırdım. –

+0

@Brock Batsell: Yorum için teşekkürler! Bu açıkladı ve şimdi max-age = XXXX – Max

+0

ile çalışır. Dosya içeriği değiştirilirse, istenen dosya güncellenmez. OP, içeriğin değişmesi durumunda dosyanın önbelleğe alınmaması gerektiğini ister. Dosya içeriği değişmemişse, önbelleğe alınmalıdır. Sağladığınız kod, "önbellekleme" özelliğini açar. OP'nin problemini çözmez. –

1

Bu kod sorununuzu çözmektedir.

"Son değiştirilen" değişkeni kontrol eder ve dosya için bir eTag atar. eTag değiştirilmişse (veya dosya değiştirilmişse), dosya görüntülenir. Aksi takdirde, sayfanın değiştirilmediğini belirten bir 304 HTTP hatası var.

eTag aslında aradığınız şeydir.

Kodu:

<?php 
// Custom variables 
$variables = array('#CCC','#800'); // from db 

// CSS Content 
header('Content-type: text/css'); 

// Last Modified 
$lastModified = filemtime(__FILE__); 

// Get a unique hash of this file (etag) 
$etagFile = md5_file(__FILE__); 

// Get the HTTP_IF_MODIFIED_SINCE header if set 
$ifModifiedSince = (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) ? $_SERVER['HTTP_IF_MODIFIED_SINCE'] : false); 

// Get the HTTP_IF_NONE_MATCH header if set (etag: unique file hash) 
$etagHeader = (isset($_SERVER['HTTP_IF_NONE_MATCH']) ? trim($_SERVER['HTTP_IF_NONE_MATCH']) : false); 

// Set last-modified header 
header("Last-Modified: ".gmdate("D, d M Y H:i:s", $lastModified)." GMT"); 

// Set etag-header 
header("Etag: $etagFile"); 

// Make sure caching is turned on 
header('Cache-Control: public'); 

// Check if page has changed. If not, send 304 and exit 
if(@strtotime($ifModifiedSince) == $lastModified || $etagHeader == $etagFile){ 
    header("HTTP/1.1 304 Not Modified"); 
    exit; 
} 
?> 
body {background: <?php echo $variables[0]; ?>;} 
İlgili konular