2009-03-16 25 views
7

मैं एक PHP आवेदन करने के लिए AJAX प्राप्त-अनुरोध भेज रहा हूँ और बाद में उपयोग के लिए अनुरोध रिटर्न कैश करने के लिए चाहते हैं अनुरोध करता है।कैश AJAX

जब से मैं प्राप्त उपयोग कर रहा हूँ यह संभव है क्योंकि विभिन्न अनुरोधों को अलग-अलग URL का अनुरोध किया जाना चाहिए (उदाहरण के लिए getHTML.php? Page = 2 और getHTML.php? Page = 5)।

क्या हेडर मैं PHP आवेदन ग्राहकों ब्राउज़र कैश को उचित तरीके से अनुरोध URL सामग्री बनाने के लिए घोषित करने के लिए की जरूरत है? मैं जो AJAX अनुरोध (मैं jQuery के $ .ajax समारोह जो एक कैश पैरामीटर है उपयोग कर रहा हूँ) संभालती जावास्क्रिप्ट में कुछ भी घोषित करने के लिए की जरूरत है?

मैं संपादन जो जैसे की सामग्री को बदल कैसे संभाल होगा getHTML.php? पृष्ठ = 2 ताकि क्लाइंट कैश किए गए संस्करण पर वापस न आ जाए? जीईटी अनुरोध में एक और पैरामीटर जोड़ना उदा। getHTML.php? पृष्ठ = 2 & संस्करण = 2 संभव नहीं है क्योंकि अनुरोध किए गए यूआरएल का लिंक बिना किसी जांच के स्वचालित रूप से बनाया गया है (जो अधिमानतः जिस तरह से मैं चाहता हूं)।

कैसे ब्राउज़र प्रतिक्रिया जब मैं एक कैश्ड अनुरोध URL AJAX अनुरोध करने की कोशिश करेंगे? क्या AJAX- अनुरोध तुरंत सफलता वापस करेगा?

धन्यवाद

विलेम

उत्तर

3

जब आप पृष्ठ रीफ्रेश, आप अभी भी सामग्री के लिए सर्वर कॉल करने के भले ही आप उन्हें पहले का अनुरोध किया है हो जाएगा। PHP हेडर आपको इसके साथ मदद नहीं करेंगे।

मुझे लगता है कि आपको वर्तमान पृष्ठ में सर्वर से पहले से अनुरोध की गई सामग्री के क्लाइंट-साइड कैशिंग तंत्र की आवश्यकता है।

इस उपयोग के लिए आप जावास्क्रिप्ट में हैश तालिका का उपयोग कर सकते हैं और पूछ सकते हैं कि सर्वर से कॉल करने से पहले। यह उपयोगकर्ता अनुभव को बढ़ाएगा क्योंकि उपयोगकर्ता को पहले से देखे गए सामग्री के किसी अन्य अनुरोध की प्रतीक्षा नहीं करनी पड़ेगी।

यहाँ एक उदाहरण है:

//placeholder for hash table as cache 
var cache = []; 

var getPage = function(pageNr){ 
    if(cache[pageNr]){ 
     //content is already in cache, use it from there 
     handleContent(cache[pageNr]); 
    } 
    else{ 
     //object with parameteres sent with GET request 
     var params = {}; 
     params.page = pageNr; 

     $.ajax({ 
      url: "getHTML.php", 
      data: params, 
      cache: false, 
      success: function(response){ 
      //handle your response here 
      handleContent(response); 

      //store the response in the cache for later use 
      cache[pageNr] = response; 
      } 
     }); 
    } 
}; 

अब का अनुरोध पृष्ठों पहले वर्तमान कैश में देखने के लिए यदि आप सामग्री है देखने के लिए होगा। यदि नहीं, तो यह सर्वर को कॉल करेगा और कैश में प्रतिक्रिया संग्रहीत करेगा।

यह उपयोगकर्ता के अनुभव के समान है जब में Google Finance

नोट है कि अगर आप पेज को ताज़ा इस कैश मिट जाएगा खबर के माध्यम से स्क्रॉल है।

किसी पृष्ठ पर संपादन के मामले में आपको यह सुनिश्चित करने के लिए याहू असाधारण प्रदर्शन के लिए मॉरीस पेरी के लिंक का उपयोग करना होगा ताकि आपका सर्वर हमेशा सामग्री का नवीनतम संस्करण लौटा रहा हो।

अधिक हैश टेबल पर जावास्क्रिप्ट में: http://www.mojavelinux.com/articles/javascript_hashes.html

+0

यह अंततः एक बहुत बड़ा कैश [] बना देगा। यही वजह है कि मैं बिल्ड-इन ब्राउज़र कैश का उपयोग करने के लिए PHP हेडर का उपयोग करने में सक्षम होने की उम्मीद कर रहा था (जो शायद एक विशाल जेएस सरणी के रूप में प्रदर्शन को प्रभावित नहीं करेगा। – Willem

+0

जब तक आप इसे एकल के रूप में उपयोग करने की योजना बना रहे हों एप्लिकेशन कैश ऑब्जेक्ट को अनुचित रूप से बड़ा नहीं होना चाहिए। जब ​​ऐसा होता है, तो याद रखें कि यह अभी भी उपयोगकर्ता के ब्राउज़र में क्लाइंट पर संग्रहीत है। किसी भी मामले में, आप इसे किसी निश्चित बिंदु तक पहुंचने पर फ़्लश करना चुन सकते हैं। –

+0

I वास्तव में एक सिंगल पेज "एप्लिकेशन" कर रहा हूं। क्या आपको यकीन है कि क्लाइंट पर ऑब्जेक्ट्स को स्टोर करना ठीक है? – Willem

9

सर्वर पर निम्न हेडर जोड़ें:

header("Cache-Control: private, max-age=$seconds"); 
    header("Expires: ".gmdate('r', time()+$seconds)); 

कहाँ $ सेकंड एक स्पष्ट अर्थ नहीं है।

इसके अलावा, जांचें कि क्या आपका सर्वर प्रज्ञा जैसे कुछ अन्य एंटी-कैशिंग हेडर जारी नहीं करता है।यदि ऐसा है, तो "प्रगमा: कैश" हेडर भी जोड़ें।

+0

+1 सही http शीर्षलेखों का उपयोग करने के लिए। – goat