2009-12-30 10 views
5

मैंने एक छोटा PHP एप्लीकेशन अंतिम रूप दिया है जो कई दस्तावेजों की सेवा कर सकता है। ये दस्तावेज ग्राहकों द्वारा और प्रॉक्सी द्वारा कैश करने योग्य होना चाहिए।क्या मेरा PHP स्क्रिप्ट कैश (सार्वजनिक) मित्रवत है?

चूंकि प्रॉक्सी मेरे परिणामों को कैश कर सकती हैं, इसलिए मुझे अतिरिक्त सावधान रहना चाहिए क्योंकि मेरे द्वारा प्रदान किए जाने वाले दस्तावेज़ों में अलग-अलग MIMEs प्रकार (सामग्री _SERVER ['HTTP_ACCEPT'] पर आधारित बातचीत हो सकती है) और विभिन्न भाषाओं (इस क्रम में आधारित: $ _POST मूल्य/$ _GET मान/यूआरएल/PHP सत्र मूल्य/$ _COOKIE मान/$ _SERVER ['HTTP_ACCEPT_LANGUAGE']/डिफ़ॉल्ट स्क्रिप्ट मान)।

शीघ्र ही सारांश में, एक पेज में कई माइम और प्रकार ही यूआरएल (: नीचे संपादन देख बदल प्रश्न) के साथ कई भाषाओं के साथ परोसा जा सकता है।

प्रॉक्सी पर कैश की सहायता के लिए मैं ईटीएजी हेडर के साथ संयोजन में "वेरी: स्वीकार्य" शीर्षलेख का उपयोग करता हूं। ईटैग वर्तमान भाषा का एमडी 5 और अंतिम संशोधित टाइमस्टैम्प है।

मैं हमेशा:

  • एक भेजें हैडर
  • समाप्त हो रहा है एक ETag भेजें एक कैश नियंत्रण हेडर
  • भेजें Last-Modified हैडर
  • भेजें एक Content-Type हैडर
  • हेडर (वर्तमान भाषा और अंतिम-संशोधित टाइमस्टैम्प के आधार पर)
  • एक सामग्री-भाषा भेजें
  • हैडर अगर दस्तावेज़ एक्सएचटीएमएल
मेरे सवाल के साथ

अब है: 0

  • एक "स्वीकार वैरी": भेजें प्रॉक्सी और ग्राहकों पर कैश मदद करने के लिए यह पर्याप्त है? क्या मुझे एक चीज़/हेडर याद आया?

    " 
    Date    Wed, 30 Dec 2009 18:56:26 GMT 
    Server   Apache/2.0.63 (Win32) PHP/5.1.0 
    X-Powered-By  PHP/5.1.0 
    Set-Cookie  Tests=697daqbmple2e1daq2dg74ur96; path=/ 
    Expires   Wed, 30 Dec 2009 21:56:26 GMT 
    Cache-Control public, max-age=10800 
    Last-Modified Mon, 28 Dec 2009 15:11:49 GMT 
    Etag    "44fa50be4638161a596e4b75d6ab7a94" 
    Vary    Accept 
    Content-Language en-us 
    Content-Length 3043 
    Keep-Alive  timeout=15, max=100 
    Connection  Keep-Alive 
    Content-Type  application/xhtml+xml; charset=UTF-8 
    " 
    

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

    आप के लिए, यहां एक परीक्षण पृष्ठ के लिए HTTP प्रतिक्रिया हेडर (अपने स्थानीय पर्यावरण पर) है ठीक मैं समझता हूँ कि इस मामले में कई माइम्स और होने के साथ एक दस्तावेज की सेवा विभिन्न भाषाओं (जो कि कई स्रोतों से आ सकती हैं - ऊपर देखें) केवल सादा खराब डिजाइन है। यदि आप ऐसा करना चाहते हैं तो बस "निजी" कैश (प्रॉक्सी पर कोई कैश नहीं) का उपयोग करें ... क्या मैं सही हूँ?

    यदि प्रत्येक भाषा में इसका अपना यूआरएल है (लेकिन प्रत्येक यूआरएल को अभी भी कई एमआईएमई के साथ परोसा जा सकता है) क्या मेरा वर्तमान कार्यान्वयन "सार्वजनिक" कैश (क्लाइंट + प्रॉक्सी पर कैश) के लिए ठीक है?

  • उत्तर

    3

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

    इसके अलावा, मुझे लगता है कि, यदि आपके पास दो क्लाइंट एक ही प्रॉक्सी से गुजर रहे हैं लेकिन विभिन्न भाषा कुकीज़ के साथ, आपकी वर्तमान विधि एक ही यूआरएल के लिए दो अलग-अलग ईटैग लौटाएगी, जिससे प्रॉक्सी प्रत्येक की प्रतिलिपि बनायेगा समय यह दूसरे ग्राहक को देखता है।

    +0

    सत्र/कुकी में केवल भाषा होती है और इसे ईटाग और सामग्री-भाषा शीर्षलेखों में भेजा जाता है ... – AlexV

    +0

    लेकिन प्रॉक्सी कैसे पता चलेगा कि कौन सी भाषा अपने ग्राहक को सेवा देगी? – Wim

    +0

    मैं अब और समझता हूं ... आप PHP में गैर-कैच करने योग्य रीडायरेक्ट को कैसे कार्यान्वित करेंगे? – AlexV

    0

    यदि प्रतिक्रिया "स्वीकार करें" और "स्वीकृति-भाषा" दोनों पर भिन्न होती है, तो दोनों को "वेरी" प्रतिक्रिया शीर्षलेख में उल्लिखित करने की आवश्यकता है।

    +0

    यह वर्तमान भाषा पर आधारित है (इस क्रम में) ($ _POST मूल्य/$ _GET मूल्य/यूआरएल/PHP सत्र मूल्य/$ _COOKIE मान/$ _SERVER ['HTTP_ACCEPT_LANGUAGE']/डिफ़ॉल्ट स्क्रिप्ट मान – AlexV

    +0

    यदि यह अनुरोध हेडर के अलावा अन्य डेटा पर भिन्न होता है, तो आपको "Vary: *" को अवश्य देना होगा, या इसे बाहर निकालना होगा और तदनुसार कैश-कंट्रोल सेट करना होगा। अन्यथा मध्यस्थों को भ्रमित कर दिया जाएगा। –

    1

    मेरा मानना ​​है कि आपको सिद्धांत में ठीक होना चाहिए - वेरी हेडर जोड़ना मतलब है कि कैश को आपके डेटा के कई उदाहरणों को ईटाग द्वारा दबाया जाना चाहिए।

    मैं ध्यान दूंगा कि आप केवल स्वीकृति पर भिन्न नहीं होते हैं, आप कुकी और स्वीकार्य-भाषा पर भी भिन्न होते हैं। कुकी द्वारा भिन्नता का अर्थ है कि प्रॉक्सी को प्रत्येक अनुरोध को मान्य करना होगा, लेकिन सर्वर को इंगित करने के लिए एक if-None-match शीर्षलेख का उपयोग करने में सक्षम होना चाहिए (पहले से कैश किया गया) ETag का उपयोग किया जाना चाहिए।

    +0

    मुझे लगता है कि आप सही हैं। जब आपके पास ऐसी कई स्थितियां हैं तो वेरी हेडर का सिंटैक्स क्या है? – AlexV

    +0

    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html अनुभाग 44 देखें। अपनी टिप्पणियों को दोबारा पढ़ना, मुझे लगता है कि आपको वेरी: *, जैसा कि भाषा बिना सत्र के बदल सकती है कुकीज़ (या कोई अन्य शीर्षलेख या यूआरएल घटक) बदल रहा है। –

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