2010-03-07 4 views
7

मेरी सीएसएस फ़ाइल एक PHP फ़ाइल है जो सामग्री-प्रकार text/css के साथ परोसा जाता है ताकि मैं उस फ़ाइल में PHP चर का उपयोग कर सकूं। style.php इस तरह दिखता है:गतिशील सीएसएस (PHP के माध्यम से जेनरेट) के लिए कैश हेडर

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

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

यह काम करता है के रूप में उम्मीद है, लेकिन ब्राउज़र डायनामिक रूप से तैयार सीएसएस फ़ाइल कैश करता है, तो मैं थोड़ा चिंतित हूँ।

फ़ायरबग में अनुरोधों को देखते समय, मुझे लगता है कि ब्राउजर style.php नया लोड करता है जब भी मैं पृष्ठ को पुनः लोड करता हूं।

मैं पहले से ही इन कैश हेडर जोड़ने की कोशिश की:

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

लेकिन कोई भाग्य। पृष्ठ लोड होने पर भी फ़ाइल लोड हो जाती है। ब्राउज़र को निश्चित समय के लिए फ़ाइल को कैश करने के लिए मजबूर करने के लिए उचित शीर्षलेख क्या हैं?

उत्तर

2

यदि आप चाहते हैं एक फ़ाइल ब्राउज़रों द्वारा संचित किया जा करने के लिए, आप जनता के लिए कैश नियंत्रण हेडर स्थापित करना चाहिए:

header('Cache-control: public'); 

चाहिए-पुनः सत्यापित है कि ब्राउज़र को देखने के लिए जाँच करेगा अगर फ़ाइल अद्यतन किया गया है इसका मतलब है , जो आपकी PHP स्क्रिप्ट का आह्वान करेगा।

+5

HTTP/1.1 कल्पना के अनुसार, कि क्या करना चाहिए सत्यापित करें मतलब माना जाता है नहीं है - यह केवल में किक करने के बाद कैश की गई सामग्री बासी हो गया है (के रूप में समाप्त हो रहा है द्वारा निर्देशित चाहिए था शीर्षलेख, या कैश-कंट्रोल के भीतर अधिकतम आयु मान), लेकिन कुछ ब्राउज़र spec को अनदेखा करते हैं और अनुरोध को वैसे भी भेजते हैं। 'सार्वजनिक' वास्तव में लागू नहीं है, हालांकि, कनेक्शन प्रमाणीकृत होने तक। मैं समाप्ति शीर्षलेख में समय को मजबूत करने के लिए 'कैश-कंट्रोल: अधिकतम आयु = 86400' का उपयोग करूंगा। –

+0

@ ब्रॉक बैटसेल: टिप्पणी के लिए धन्यवाद! यह स्पष्ट करता है और यह अब अधिकतम आयु = XXXX – Max

+0

के साथ काम करता है यदि फ़ाइल सामग्री बदल दी गई है, तो अनुरोध की गई फ़ाइल अपडेट नहीं की जाएगी। ओपी अनुरोध करता है कि अगर सामग्री बदली जाती है तो फ़ाइल को कैश नहीं किया जाना चाहिए। अगर फ़ाइल सामग्री नहीं बदली है, तो इसे कैश किया जाना चाहिए। आपके द्वारा प्रदान किया गया कोड "कैशिंग" सुविधा पर बदल जाता है। यह ओपी की समस्या को हल नहीं करता है। –

1

यह कोड आपकी समस्या का समाधान करता है।

यह "अंतिम संशोधित" चर की जांच करता है और फ़ाइल के लिए एक ईटैग असाइन करता है। यदि ईटैग संशोधित है (या फ़ाइल संशोधित है), फ़ाइल प्रदर्शित होती है। अन्यथा, एक 304 HTTP त्रुटि बताती है कि पृष्ठ संशोधित नहीं किया गया था।

ईटैग वास्तव में आप जो खोज रहे हैं वह वास्तव में है।

कोड:

<?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]; ?>;} 
संबंधित मुद्दे