2012-05-15 14 views
14

द्वारा बनाए गए होते हैं तो HTTP प्रतिक्रियाओं को कैशिंग करते हैं, मुझे लगता है कि मेरा प्रश्न बहुत ही अनौपचारिक लगता है लेकिन मेरे साथ सहन करता है क्योंकि यह दिलचस्प हो जाता है (कम से कम मेरे लिए :))।जब वे गतिशील रूप से PHP

एक PHP पृष्ठ पर विचार करें कि इसका उद्देश्य फाइल सिस्टम से अनुरोधित फ़ाइल को पढ़ना है और इसे प्रतिक्रिया के रूप में गूंजना है। अब सवाल यह है कि इस पृष्ठ के लिए कैश कैसे सक्षम करें? बात करने की बात यह है कि फाइलें बहुत बड़ी हो सकती हैं और कैश को सक्षम करना क्लाइंट को बार-बार एक ही सामग्री को डाउनलोड करने से बचाने के लिए है।

आदर्श रणनीति एक रिवर्स प्रॉक्सी कैश सिस्टम को लागू करने के लिए "अगर-कोई-मैच" अनुरोध शीर्षलेख और "ETag" प्रतिक्रिया शीर्षलेख का उपयोग नहीं करेगी। भले ही मैं इसे अब तक जानता हूं, मुझे यकीन नहीं है कि यह संभव है या मुझे इस तकनीक को लागू करने के लिए प्रतिक्रिया के रूप में क्या प्रतिक्रिया देनी चाहिए!

+0

कूल आंख। हालांकि मेरे लिए अभी भी एक मैच नहीं है। –

+0

इतना यकीन न करें, इस आंख का मालिक अब जुबबी की जिन्चुरीकि है! – Mehran

+0

अभी के लिए, लेकिन मेरा ट्रम्प कार्ड अभी तक खुलासा नहीं किया गया था। आइए इस चैट को जारी रखें [एनीम और मंगा चैट] (http://chat.stackexchange.com/rooms/6697/anime-and-manga)। इस धागे को अव्यवस्थित करने के लिए नहीं। –

उत्तर

25

PHP के साथ बड़ी या कई सहायक फाइलों की सेवा करना बिल्कुल ठीक नहीं है।

इसके बजाय, X-accel nginx के लिए, X-Sendfile लाइटटैड के लिए या mod_xsendfile अपाचे के लिए देखें।

प्रारंभिक अनुरोध पीएचपी द्वारा नियंत्रित किया जाता है, लेकिन एक बार डाउनलोड फ़ाइल निर्धारित किया गया है यह कुछ हेडर सेट संकेत मिलता है कि सर्वर जिसके बाद पीएचपी प्रक्रिया कुछ और की सेवा के लिए उपलब्ध हो जाती है फ़ाइल को भेजने, संभाल चाहिए।

फिर आप अपने लिए कैशिंग कॉन्फ़िगर करने के लिए वेब सर्वर का उपयोग कर सकते हैं।

स्टेटिक सामग्री

उत्पन्न अपनी सामग्री PHP से उत्पन्न होता है और बनाने के लिए विशेष रूप से महंगा है, तो आप एक स्थानीय फाइल करने के लिए उत्पादन लिख सकते हैं और उपरोक्त विधि फिर से लागू हो सकते हैं।

आप एक स्थानीय फाइल करने के लिए नहीं लिख सकते हैं या, आप कैशिंग नियंत्रित करने के लिए HTTP प्रतिक्रिया हेडर का उपयोग कर सकते हैं करने के लिए नहीं करना चाहते हैं: इसके समाप्त होने तक

Expires: <absolute date in the future> 
Cache-Control: public, max-age=<relative time in seconds since request> 

इस कारण होगा ग्राहकों पेज की सामग्री को कैश करने के लिए या जब कोई उपयोगकर्ता पृष्ठ रीलोड को मजबूर करता है (उदाहरण के लिए F5 दबाएं)।

गतिशील सामग्री

गतिशील सामग्री आप ब्राउज़र आप हर बार पिंग के लिए उत्पन्न है, लेकिन वहाँ है कि अगर कुछ नया ही पृष्ठ सामग्री भेजें। ज्यादातर कम करने के लिए प्रयोग किया जाता है

If-None-Match: <hash of the contents that you sent last time> 
If-Modified-Since: <absolute date of last contents change> 

ETag:

ETag: <hash of the contents> 
Last-Modified: <absolute date of last contents change> 

ब्राउज़र फिर से अपनी स्क्रिप्ट पिंग्स है, वे निम्नलिखित अनुरोध हेडर क्रमशः जोड़ना होगा: आप कुछ अन्य प्रतिक्रिया हेडर सेट करके ऐसा कर सकते हैं नेटवर्क यातायात कुछ मामलों में, सामग्री हैश को जानने के लिए, आपको पहले इसकी गणना करनी होगी।

Last-Modified यदि आपके पास स्थानीय फ़ाइल कैश हैं (फ़ाइलों में संशोधन दिनांक है) लागू करने के लिए सबसे आसान है। एक साधारण हालत यह काम करता है:

if (!file_exists('cache.txt') || 
    filemtime('cache.txt') > strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { 
    // update cache file and send back contents as usual (+ cache headers) 
} else { 
    header('HTTP/1.0 304 Not modified'); 
} 

आप फ़ाइल कैश नहीं कर सकते हैं, तो आप अभी भी ETag उपयोग कर सकते हैं निर्धारित करने के लिए सामग्री को तब तक बदल दिया है।

+0

यह मेरा बुरा है कि मैं उल्लेख करना भूल गया, PHP को समाप्त करना असंभव है। PHP के भीतर एक जटिल तर्क हो सकता है। – Mehran

+0

@MehranZiadloo शायद आपको मेरा जवाब नहीं मिला, मैंने इसे दोहराया है। –

+0

भले ही आपके अपडेट ने आपके बिंदु को स्पष्ट किया लेकिन मुझे डर है कि PHP को खत्म करना अभी भी असंभव है क्योंकि सामग्री कभी-कभी लोड होने के बजाय उत्पन्न होती है। फिर भी धन्यवाद। – Mehran

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