2009-07-21 11 views
7

मुझे कुछ ट्यूटोरियल्स मिल गए हैं कि कैसे एक सीएसएस फ़ाइल को gzip करने के लिए जिसमें आप संपीड़न के साथ सीएसएस फ़ाइलों को शामिल करने के लिए एक सार्वजनिक PHP फ़ाइल बनाते हैं। समस्या यह है कि मैं इसे अपने सीएसएस फ़ाइलों को कैश करने के लिए नहीं मिल सकता है। मैं संदर्भ के लिए फायरबग का उपयोग कर रहा हूं और मैंने वास्तव में कुछ जावास्क्रिप्ट को संपीड़ित करने के लिए एक ही कोड का उपयोग करने की कोशिश की है और यह ठीक है।कैशिंग gzipped css

 
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(); 
} 

तो मैं बस अन्य पृष्ठों पर एक सीएसएस दस्तावेज़ के रूप में मेरे लिए php फ़ाइल को संदर्भित कर रहा हूँ:

यहाँ कोड है। जैसा कि आप देख सकते हैं कि मैंने मिश्रण में अधिकतम आयु जोड़ने का प्रयास किया है जो असफल साबित होता है।

यहाँ प्रतिक्रिया हेडर हैं

 
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 

क्या मैं याद कर रहा हूँ, या एक बेहतर तरीका ऐसा करने के बारे में जाने के लिए है?

धन्यवाद,

संपादित करें:

एक स्क्रिप्ट है कि पता लगाता है या नहीं, फ़ाइल बदल दिया गया है & एक 304 भेजने यह नहीं, उचित हेडर के साथ संयोजन में इस समस्या को हल किया है गया है।

आर्थर

उत्तर

7

हेडर के सेट करने के लिए इस जोड़ने का प्रयास करें: -

$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'); 

समस्या कैश नियंत्रण हेडर में must-revalidate अनुदेश था। इससे क्लाइंट को प्रत्येक बार इसकी आवश्यकता होने पर सीएसएस का फिर से अनुरोध करने का कारण बनता है और आपके कोड में अगर-संशोधित-हेडर हेडर और 304 अनमोडिफाइड प्रतिक्रिया स्थिति कोड भेजने के लिए कोई संभाल नहीं है।

उपर्युक्त दृष्टिकोण कैश अवधि को 1 दिन तक कम कर देता है और अनिवार्य निर्देश को समाप्त कर देता है। यह अंतिम-संशोधित शीर्षलेख भी जोड़ता है (एक कैश किसी आइटम को कैश नहीं करना चुन सकता है जब अंतिम-संशोधित या ईटाग हेडर गुम हो जाता है)।

इसे बेहतर बनाने के लिए आप उस सीएसएस फ़ाइल का वास्तविक अंतिम संशोधित समय पा सकते हैं जिसे आप संपीड़ित कर रहे हैं और इसे अंतिम-संशोधित शीर्षलेख के रूप में भेजें। आप अपने कोड में अनुरोधों की तुलना शामिल कर सकते हैं यदि संशोधित- सीएसएस फ़ाइलों के मूल्य के साथ हेडर पिछले संशोधित समय के साथ। यदि आप उन्हें पाते हैं तो हेडर के इस सेट को भेजें, लेकिन 304 अनमोडेड स्थिति भी भेजें और शरीर को बिल्कुल न भेजें। (मैं वास्तव में एक PHP व्यक्ति नहीं हूं इसलिए मैं इसे PHP विशेषज्ञों को किसी अन्य उत्तर में रखने के लिए छोड़ दूंगा)।

एक यथार्थवादी आकलन करें कि आप कितनी देर तक क्लाइंट को सीएसएस को कैश करना चाहते हैं इससे पहले कि इसे पुनर्प्राप्त करने के लिए एक और प्रयास करना चाहिए और उसके अनुसार अधिकतम आयु मान निर्धारित करना चाहिए।

+0

हे एंथनी, मैंने अंतिम-संशोधित जोड़ने की कोशिश की है जैसे कि आपने बाद में और पिछली संशोधन तिथि के संयोजन के साथ कोई भाग्य नहीं दिया है। मैंने हेडर्स को ईटाग के साथ भी भेजा है और यदि से संशोधित किया गया है, और यह अभी भी कैशिंग नहीं है ... आपकी प्रतिक्रिया के लिए धन्यवाद, मैं भविष्य में संदर्भ और डिबगिंग के लिए यह सब ध्यान में रखूंगा। – askon

+0

@askon: वे महत्वपूर्ण कारक नहीं थे, मुख्य समस्या यह है कि आप कैश-कंट्रोल हेडर में अनिवार्य निर्देश को शामिल करना चाहते हैं। इसका उपयोग करना मतलब है कि सीएसएस हमेशा पुनः प्राप्त किया जाएगा। क्या आप अपने परीक्षण में पेज रीफ्रेश (एफ 5) का भी उपयोग कर रहे हैं? इससे कुछ भी साबित नहीं होगा, सीएसएस जैसे संसाधन रीफ्रेश संदर्भ के तहत रीफ्रेश किए गए हैं और आपके कोड में निर्मित 304 तंत्र के बिना संसाधन के पूर्ण प्राप्त होने के परिणामस्वरूप। – AnthonyWJones

+0

क्षमा करें मुझे थोड़ा और विशिष्ट होना चाहिए था। मैं चाहिए पुनः सत्यापित लाइन को दूर किया था, यहाँ मेरी शीर्ष लेख प्रतिक्रिया है: http://freetexthost.com/zqbddbchvz मैं क्या समझ में नहीं आता है मैं एक पाठ/जावास्क्रिप्ट को छोड़कर ठीक उसी स्क्रिप्ट कोशिश कर सकते हैं दस्तावेज़ और यह 200 और कैश दिखाता है। – askon

-1

आप अजगर/Django पढ़ा, तो आप django compressor के लिए कोड को पढ़ सकता है। यह कई सीएसएस फाइलों को एक में रखता है। सीएसएस भाग ऐसा लगता है कि यह सीएसएस को साफ करने के लिए CSSTidy लॉन्च करता है।

+0

2014-12-03: अरे, @downvoter, साढ़े साल के उत्तर पर आपके विचारों को रोकने और देने के लिए धन्यवाद। – hughdbrown

संबंधित मुद्दे