Back to Question Center
0

साम्बाल्ट: क्या यह मेरे संपूर्ण यूजर इमेज फाइल स्ट्रक्चर को बदलकर सरल ब्राउज़र कैशिंग का लाभ उठा सकता है?

1 answers:

मेरी एक मोबाइल साइट पर, मैं अपने उपयोगकर्ता की प्रोफ़ाइल चित्रों को '1 के रूप में संग्रहीत करता हूं I. jpg 'अपने उपयोगकर्ता फ़ोल्डर में, और वृद्धि से वहाँ अपलोड किसी भी अतिरिक्त pics के लिए वे अपलोड. इसका मतलब यह है कि जब भी वे अपना प्रोफ़ाइल चित्र बदलते हैं, उदाहरण के लिए, फ़ाइल नाम एक ही रहता है.

मैं छवि कैशिंग का लाभ लेना चाहता हूं ताकि एक ही पुरानी तस्वीर किसी उपयोगकर्ता के प्रोफ़ाइल को देखे और फिर से देखे जाने पर फिर से डाउनलोड न हो, लेकिन एक ही समय में, मैं अपने उपयोगकर्ता चाहता हूं 'ब्राउज़र बदल गया है अगर इसे बदल दिया गया है - wa government superannuation preservation age.

मैं क्या पढ़ रहा हूं, ऐसा लगता है कि वास्तव में ऐसा करने का एकमात्र तरीका वास्तव में यादृच्छिक फ़ाइल नामों का उपयोग करना है और डीबी में उन सभी फाइलों का नज़र रखना है, ताकि आप एक गैर-समाप्ति कैश सेट कर सकें , जबकि हाल ही में बदल दी गई तस्वीरों को फिर से खींचा जाता है क्योंकि उनके पास एक नया फ़ाइल नाम है. जिस तरह से मैंने उन्हें अब तक संरचित किया है, की सुंदरता यह है कि मैं डेटाबेस को पूरी तरह से छोड़ सकता हूं और फ़ाइलों का सीधे उपयोग कर सकता हूं क्योंकि उनका स्थान पूर्वानुमानित है.

तो मेरा सवाल है, क्या यह मेरे लिए पूरी साइट संरचना की पूरी संरचना को बदलना है, साथ ही नए अपलोड पर अनन्त कैशिंग और स्वत: पुनः डाउनलोड करने के लाभ के लिए डीबी तत्व जोड़ता है?

यह एक बड़ा उपक्रम है, लेकिन अगर यह योग्य समझा जाता है, तो मुझे इस कठोर परिवर्तन से आगे बढ़ने में कोई समस्या नहीं है. मैं सिर्फ यह सुनिश्चित करना चाहता हूं कि "बड़े लड़के" ऐसा करते हैं कि मुझे फिर कभी फाइल संरचना को बदलना नहीं पड़ेगा.

धन्यवाद.

February 12, 2018

सामान्य तौर पर इस्तेमाल किया जाने वाला हल आपकी छवि यूआरएल इस तरह दिखता है:

  http: // www. उदाहरण. com / path / to / छवियों / 1. जेपीजी? v = 123456 

यहां, / पथ / प्रति / चित्र / 1. जेपीजी छवि का वास्तविक यूआरएल पथ है, जबकि ? वी = 123456 यूआरएल के अंत में हमला करने वाली एक डमी क्वेरी है. प्रश्न स्ट्रिंग कुछ भी हो सकता है - एक संस्करण संख्या, टाइमस्टैम्प, छवि सामग्री का एक हैश - जब भी आप इसे बदलते हैं, जब भी छवि बदलती है, और इसे उसी तरह रखे जब यह नहीं होता है.

चाल यही है कि वेब सर्वर, जब ऐसे यूआरएल की सेवा करने के लिए कहा जाता है, क्वेरी स्ट्रिंग को अनदेखा कर देगा, क्योंकि यूआरएल वास्तव में एक स्थिर फाइल. लेकिन उपयोगकर्ता के ब्राउज़र (और बीच में किसी भी प्रॉक्सी के लिए), अलग-अलग क्वेरी स्ट्रिंग वाले URL पूरी तरह से अलग होंगे, और इसलिए क्वेरी स्ट्रिंग में कोई भी परिवर्तन ब्राउज़र को फ़ाइल को पुनः लोड करने के लिए बाध्य करता है. ऐसा करने का एक तरीका है, यदि आप अपाचे mod_expires के साथ प्रयोग कर रहे हैं, तो एक . आपकी छवि निर्देशिका में htaccess फ़ाइल लाइनों के साथ:

  समाप्त होने पर सक्रिय
समाप्त होता है डिफॉल्ट "एक्सेस प्लस 1 वर्ष" 

यह तकनीक कई लोकप्रिय वेबसाइटों द्वारा उपयोग की जाती है. उदाहरण के लिए, यदि आप इस पेज के एचटीएमएल स्रोत को देखते हैं, तो आपको पता चल जाएगा कि इसके लिए एक स्टाइल शीट एक यूआरएल से लोड की गई है:

  http: // cdn. sstatic. शुद्ध / stackoverflow / सभी. सीएसएस? v = 7cd8ea9d6f1e 

यहां, ? V = 7cd8ea9d6f1e एक डमी क्वेरी स्ट्रिंग है जैसा मैंने ऊपर वर्णित किया है; आप पुष्टि कर सकते हैं कि इसे बदलकर और यह देखकर कि वह वास्तव में एक ही फ़ाइल लौटाता है.

कैश करने के लिए एक से अधिक तरीके हैं.

सशर्त प्राप्त

यदि आप इन छवियों को फ़ाइल सिस्टम पर संग्रहीत कर रहे हैं और वेब सर्वर के माध्यम से सीधे सेवा कर रहे हैं, तो संभवतः आप पहले से ही सशर्त मिलते हैं . वेब सर्वर स्वत: एक ईTAG हेडर सेट करने के लिए फाइल सिस्टम मेटाडेटा का उपयोग करेगा, और अगर ब्राउज़र में यदि- संशोधित-चूंकि या यदि- मैचों हेडर हों तो स्वचालित रूप से "304 संशोधित नहीं" के साथ जवाब देंगे इसके अनुरोध में. (सभी ब्राउज़र्स करेंगे. )

इस मामले में पूरी छवि वापस नहीं की गई है, इसलिए आपके पास बैंडविड्थ बचत है. हालांकि, एक GET अनुरोध जारी किया जाएगा, इसलिए अब भी आपके पास अनुरोध के ओवरहेड और विलंबता होगा.

आप अपने वेबसर्वर सेट कैश-कंट्रोल हेडर के साथ सार्वजनिक, मैक्स-आयु = एन के मान के साथ कैश ताजगी की कीमत पर अनुरोधों की संख्या को कम कर सकते हैं इमेजिस. यह कहता है कि कैश के लिए संसाधन को अधिकतम अधिकतम-आयु सेकेंड्स के पहले रख सकते हैं, इससे पहले कि उन्हें यह अद्यतन किया गया है या नहीं।.

हालांकि, HTTP एक कैश एंट्री को रद्द करने का केवल एक तरीका निर्धारित करता है, जो आपके एप्लिकेशन के शब्दों को ठीक नहीं कर सकता है: यदि आपने पोस्ट या यूआरएल को पोस्ट किया है जो प्रोफाइल फोटो अपडेट करता है, तो स्थान के साथ उत्तर दें: [url का फोटो ] हैडर और उस यूआरएल के लिए कैश प्रविष्टि को रद्द कर दिया जाएगा.

(यह तंत्र है जो आपको टिप्पणियों के साथ एक वेबपेज कैश करने की अनुमति देता है, और उसके बाद उपयोगकर्ता को एक नया टिप्पणी पोस्ट करने के बाद जबरन ब्राउज़र द्वारा पुनः लोड किया गया है. ब्राउज़र पोस्ट / टिप्पणी के साथ 303 देखें अन्य और एक स्थान: / पृष्ठ / के साथ / टिप्पणी . नोट करें कि यह लंबे समय तक बग के कारण फ़ायरफ़ॉक्स में काम नहीं करता था. )

जब तक आपके पास बहुत से यातायात नहीं है, कैशिंग के लिए यह तरीका ठीक है.

यूआरएल बदलना

एक यूआरएल एक संसाधन का प्रतिनिधित्व है, इसलिए कैशिंग के प्रबंधन का एक और तरीका संसाधन के लिए कैश पैरामीटर को बदलना नहीं है, बल्कि एक "कैश हमेशा के लिए" निर्देश के साथ एक नया संसाधन बनाने के लिए. यह दृष्टिकोण है कि "बड़े लड़के" पक्ष में हैं, क्योंकि इससे उन्हें कोई अतिरिक्त अतिरिक्त अनुरोध उत्पन्न करने की अनुमति मिलती है, उन्हें बहुत सारे बैंडविड्थ. नकारात्मक पक्ष के लिए यह बहुत अधिक अतिरिक्त बहीखाता की आवश्यकता है.

इसके लिए दो सामान्य तकनीकें हैं.

प्रश्न स्ट्रिंग

फ़ाइल सिस्टम से फ़ाइल की सेवा करते समय वेब सर्वर क्वेरी स्ट्रिंग की उपेक्षा करते हैं. कैश, हालांकि, नहीं: / 1. jpg? t = 12345 और / 1. jpg? t = 67890 दो पूरी तरह से अलग, असंबंधित संसाधन हैं, भले ही सर्वर सोचता है कि वे समान हैं.

तो एक आसान बात यह है कि जब भी आप अपने HTML में एक संसाधन के संदर्भ बनाते हैं, और एक लंबी की अवधि समाप्त शीर्ष लेख सेट करते हैं, तो एक क्वेरी स्ट्रिंग के रूप में फाइलसिस्टम टाइमस्टैम्प जोड़ना है. ब्राउज़र तब इस संसाधन को हमेशा के लिए कैश करेगा और न कि किसी भी GET के रूप में लंबे समय के रूप में क्वेरी स्ट्रिंग बदल नहीं करता है.

एक नकारात्मक पक्ष यह है कि यदि किसी वस्तु के लिए नए यूआरएल के वेबसर्वर को निर्देश देना मुश्किल या असंभव है, यदि आप जबरन एक कैश को अवैध बनाना चाहते हैं. उदाहरण के लिए, यदि किसी ब्राउज़र में एक / 1 के साथ एक कैश किए गए HTML पृष्ठ है. jpg? v = 1 संदर्भ, लेकिन / 1 के लिए प्रवेश साफ़ करने के लिए हुआ. jpg? v = 1 (शायद यह फ़ाइल या मेमोरी स्पेस से बाहर हो गया), यह / 1 के लिए एक नया अनुरोध करेगा. jpg? v = 1 . अगर इस बीच में छवि बदल गई है / 1. jpg? v = 2 , उचित प्रतिक्रिया या तो है:

  1. फाइल के पुराने संस्करण परोसें. आप ऐसा करेंगे यदि आप चाहते हैं कि सभी संसाधन एक-दूसरे के साथ संगत हों क्योंकि वे निश्चित समय पर होते थे. सीएसएस फाइलों के साथ यह आपको करना चाहिए, उदाहरण के लिए, क्योंकि एक पुरानी एचटीएमएल फाइल के साथ एक नई सीएसएस फाइल ठीक से काम नहीं कर सकती है!
  2. 301 का उपयोग करके फ़ाइल के नए संस्करण पर पुनर्निर्देशन स्थायी रूप से स्थानांतरित . आप ऐसा करेंगे यदि आप सभी संसाधनों को जितना संभव हो उतना नया होना चाहते थे.

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

फ़ाइल नाम

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

एचपी स्थिति 304 संशोधित नहीं के बारे में पढ़ें, आपको 304 के साथ एक डाउनलोड अनुरोध के जवाब में सक्षम होना चाहिए, और इससे सर्वर को कैश्ड डेटा का उपयोग करने के लिए बताए, इसे ब्राउज़र में भेजना. और इस सवाल को पढ़ें https: // stackoverflow. com / questions / 2978496 / make-php-page-return-304-not-modified-if-it-has not-modified-