Php site के लिए Browser cache कैसे रोके


120

मेरे पास क्लाउड सर्वर में एक php साइट चल रही है। जब भी मैं नई फाइल css, js या इमेजेस को जोड़ता हूं, तो वही पुरानी js, css और इमेज फाइल्स को कैश में स्टोर किया जाता है।

मेरी साइट में नीचे के रूप में एक doctype और मेटा टैग है

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <meta http-equiv="Page-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Page-Exit" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Enter" content="blendTrans(Duration=1.0)">
  <meta http-equiv="Site-Exit" content="blendTrans(Duration=1.0)">

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


No Cache in all Browsers। आप उन फाइलों पर भी एक यादृच्छिक (यादृच्छिक-आकारयुक्त) कर सकते हैं जिन्हें आप कैश नहीं करना चाहते हैं।
कोडमोन

2
आप शायद छवियों / js / css के लिए पूरी तरह से कैश को अक्षम नहीं करना चाहते: stackoverflow.com/questions/4206224/…
बेवकूफ

नेक्रो के प्रलोभन का विरोध किया, लेकिन कृपया, इस पर विचार करने वाला कोई भी: बंद करो। कैशिंग को नियंत्रित और उपयोग करना सीखें, केवल एक असुविधाजनक प्रकरण के कारण इसे आँख बंद करके अक्षम न करें। HTTP से कैशिंग पर अध्याय पढ़ें निश्चित मार्गदर्शिका - इस पुस्तक (और RFC) को एक परीक्षण के साथ अनिवार्य रूप से पढ़ना चाहिए। अंतिम-संशोधित निर्दिष्ट करने का तरीका जानें, इफ़-संशोधित-बाद से जवाब दें और ETag पहचान का उपयोग करें। फिर जब परिसंपत्ति को अपडेट किया जाता है, तो ब्राउज़रों को सूचित किया जाएगा कि जब 304 एक बार फिर 200 हो जाता है।
रात्रि

जवाबों:


282

इसे इस्तेमाल करे

<?php

header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
?>

6
"अधिकतम-आयु = 0" को छोड़कर, वे PHP हैं जो मेरी स्थापना में उपरोक्त निर्दिष्ट किए बिना PHP द्वारा भेजे गए हैं .. ऐसा लगता है कि PHP डिफ़ॉल्ट रूप से ब्राउज़र कैशिंग को रोकने की कोशिश करता है ...
तेजी से रिफ्लेक्स

1
मेरे पास एक वर्डप्रेस प्लगइन है जो इंटरनेट एक्सप्लोरर के पुराने संस्करणों के लिए एक वैकल्पिक विषय भेजता है और यह कुछ कैशिंग सिस्टमों पर बुरी तरह से फंस रहा था। यह पोस्ट मेरी पहली Google खोज पर आया था। बहुत बढ़िया।
इम्पीरियल

3
ध्यान रखें कि यह html के अंदर एम्बेड नहीं किया जा सकता है; यह पृष्ठ के शीर्ष पर होना चाहिए।
हंटर एस

9
नोट: यदि आप session_start()बाद में उपयोग करते हैं , तो यह आपके हेडर को ओवरराइट कर देगा Cache-Control: private, max-age=10800, pre-check=10800क्योंकि 180 मिनट का डिफ़ॉल्ट मान है session.cache_expire। यदि आप सत्र शुरू करने से बच नहीं सकते हैं, लेकिन आपको कैश उपयोग को अक्षम करना होगा session_cache_limiter('private');session_cache_expire(0);
एमगुटैट

2
@thdoan फ़ंक्शन का दूसरा पैरामीटर प्रतिस्थापित करने के लिए headerएक बूलियन है । वैकल्पिक प्रतिस्थापित पैरामीटर इंगित करता है कि क्या हेडर पिछले समान हेडर को बदलना चाहिए, या उसी प्रकार का दूसरा हेडर जोड़ना चाहिए।
मृरैया 19

36

यहां, यदि आप इसे HTML के माध्यम से नियंत्रित करना चाहते हैं: नीचे विकल्प 1 की तरह करें :

<meta http-equiv="expires" content="Sun, 01 Jan 2014 00:00:00 GMT"/>
<meta http-equiv="pragma" content="no-cache" />

और अगर आप इसे PHP के माध्यम से नियंत्रित करना चाहते हैं: तो इसे नीचे विकल्प 2 की तरह करें :

header('Expires: Sun, 01 Jan 2014 00:00:00 GMT');
header('Cache-Control: no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', FALSE);
header('Pragma: no-cache');

और विकल्प 2 हमेशा आधारित कैशिंग समस्या से बचने के लिए हमेशा बेहतर है।


10

आप यह कोशिश कर सकते हैं:

    header("Expires: Tue, 03 Jul 2001 06:00:00 GMT");
    header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
    header("Cache-Control: no-store, no-cache, must-revalidate, max-age=0");
    header("Cache-Control: post-check=0, pre-check=0", false);
    header("Pragma: no-cache");
    header("Connection: close");

उम्मीद है कि यह कैश को रोकने में मदद करेगा, यदि कोई हो!


यह केवल HTML फ़ाइलों के कैशिंग से संबंधित है? और इसका eTag से कोई लेना-देना नहीं है? धन्यवाद!
सैम लेविन

4
बस पहली पंक्ति पूरी तरह से पर्याप्त होनी चाहिए। 5 वीं पंक्ति वास्तव में स्पष्ट रूप से गलत है और सर्वर प्रतिक्रिया में इसका कोई लेना-देना नहीं है (यह एक अनुरोध शीर्ष लेख है)। छठी पंक्ति का कोई प्रभाव नहीं होगा। मैं आगे
बढ़

बन्दूक दृष्टिकोण: दीवार पर सब कुछ फेंक दो, आशा है कि कुछ चिपक जाएगा। प्रश्न के बारे में मेरी टिप्पणी के अनुसार, मैं अत्यधिक HTTP की एक प्रति हथियाने की सिफारिश कर सकता हूं : निश्चित गाइड और कैशिंग के अध्याय को पढ़ना। इसके अलावा RFC, लेकिन उन्हें पढ़ना एक अलग कौशल है। ("कनेक्शन: करीब" अनुरोधों के कुशल पाइपलाइनिंग को अक्षम करने, शामिल करने के लिए एक उल्लसित पैर-शॉट है, या कुछ भी नहीं करेगा, लेकिन मुझे संदेह है कि PHP वास्तव में इसके माध्यम से हो सकता है।)
amcgregor

7

मुझे अपनी सीएसएस फाइलों को कैशिंग करने में समस्या थी। PHP में हेडर सेट करने से मुझे मदद नहीं मिली (शायद इसलिए हेडर को पेजिंग करने के बजाय स्टाइलशीट फ़ाइल में सेट करने की आवश्यकता होगी?)।

मुझे इस पृष्ठ पर समाधान मिला: https://css-tricks.com/can-we-prevent-css-caching/

समाधान:

लिंक की गई फ़ाइल के लिए URI के क्वेरी भाग के रूप में टाइमस्टैम्प को जोड़ें।
(सीएसएस, जेएस, छवियों आदि के लिए इस्तेमाल किया जा सकता है)

विकास के लिए:

<link rel="stylesheet" href="style.css?<?php echo date('Y-m-d_H:i:s'); ?>">

उत्पादन के लिए (जहां कैशिंग ज्यादातर एक अच्छी बात है):

<link rel="stylesheet" type="text/css" href="style.css?version=3.2">
(और जब यह आवश्यक हो तो मैन्युअल रूप से फिर से लिखना)

या इन दोनों का संयोजन:

<?php
    define( "DEBUGGING", true ); // or false in production enviroment
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo (DEBUGGING) ? date('_Y-m-d_H:i:s') : ""; ?>">

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

या उन दो का सुंदर संयोजन:

<?php
    // Init
    define( "DEBUGGING", true ); // or false in production enviroment
    // Functions
    function get_cache_prevent_string( $always = false ) {
        return (DEBUGGING || $always) ? date('_Y-m-d_H:i:s') : "";
    }
?>
<!-- ... -->
<link rel="stylesheet" type="text/css" href="style.css?version=3.2<?php echo get_cache_prevent_string(); ?>">

मनमाने ढंग से संस्करण, वर्तमान टाइमस्टैम्प (पूरी तरह से कैशिंग को हराते हुए) ... लेकिन एक चीज नहीं जो वास्तव में "डिबगिंग" ध्वज की परवाह किए बिना समझदारी और काम करती है। आप फ़ाइल के वास्तविक माइम का उपयोग क्यों नहीं कर रहे हैं? तब आप सचमुच PHP को अद्यतन करने की आवश्यकता नहीं होगी, और कैश पूरी तरह से और काल्पनिक रूप से बेकार नहीं होगा। या बस अपने स्टैटिक्स को एनजीएक्स या अपाचे जैसे ठीक से कॉन्फ़िगर किए गए HTTP सर्वर के साथ वितरित करें जो एक उचित अंतिम-संशोधित और ETag सेट करता है। इसी प्रकार, ब्राउज़र में उस प्रकार का "डीबगिंग" ध्वज पहले से मौजूद है ... (कैश अक्षम करें, कैश के बिना ताज़ा करें, खाली कैश…)
amcgregor

5

ब्राउज़र कैश को रोकना मामले के आधार पर एक अच्छा विचार नहीं है। एक समाधान की तलाश में मैं इस तरह से समाधान पाया:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=filemtime($file);?>">

यहाँ समस्या यह है कि अगर सर्वर पर अपडेट के दौरान फाइल ओवरराइट हो जाती है, जो कि मेरा परिदृश्य है, तो कैश को नजरअंदाज कर दिया जाता है क्योंकि टाइमस्टैम्प को संशोधित किया जाता है, यहां तक ​​कि फाइल की सामग्री भी समान होती है।

मैं इस समाधान का उपयोग ब्राउज़र को संपत्ति डाउनलोड करने के लिए बाध्य करने के लिए करता हूं केवल तभी जब उसकी सामग्री संशोधित हो:

<link rel="stylesheet" type="text/css" href="meu.css?v=<?=hash_file('md5', $file);?>">

ओह! यह प्रदर्शन और मापनीयता के लिए हमेशा भयानक होगा कि आप अपने सभी CSS / JS फाइलों को मुख्य थ्रेड में लोड करके उनके आकार / हैश की जाँच कर सकें।
डालिन

@ डालिन इससे पहले कि आप जेंटू रिसर (एक लिनक्स डिस्ट्रो जिसे "फास्ट के लिए जाना जाता है" के आँसू रोते हैं, स्रोत और आर्किटेक्चर-ट्यून से अत्यधिक संकलित होकर) मैं एक statकॉल क्लॉक करूँगा । फाइलसिस्टम कैश के बिना, 16ns, सबसे ऊपर? कैश के साथ, मज़बूती से <8ns। नैनोसेकंड। और मेरे सिस्टम पर एमडी 5 754 मिब / एस को बिना पलक झपकाए प्रोसेस कर सकता है। ( openssl speed md5) संयुक्त, एक 100KB CSS फ़ाइल में एक अतिरिक्त अतिरिक्त ओवरहेड होगा ... 129µs (माइक्रोसेकंड, 0.1295ms) + 8ns (जो अंतिम संख्या में सार्थक योगदान नहीं करता है) = 129µs।
13 अक्टूबर

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

आप और मैं शायद विभिन्न वेबसाइटों पर काम करते हैं। लेकिन मैं अपनी टिप्पणी से खड़ा हूं। यदि समय के किसी भी बिंदु पर वेब पृष्ठों को वितरित करने वाले दर्जनों समवर्ती धागे हैं, तो मुझे लगता है कि बेहतर विकल्प हैं कि आपको यह सवाल करने की आवश्यकता नहीं होगी कि क्या यह स्केलेबल है। hash_file('md5', $deployment_counter)या hash_file('md5', $cache_clear_counter)दिमाग में आने वाले पहले व्यक्ति हैं।
दलिन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.