PHP

2010-01-04 5 views
10

में HTTP_IF_MODIFIED_SINCE और HTTP_IF_NONE_MATCH का उत्तर देने में मेरे पास PHP 5.1.0+ में कैश करने योग्य गतिशील सामग्री है। मैं पहले से ही ग्राहकों को सही शीर्षलेख (अंतिम-संशोधित और ईटीएजी सहित) भेजता हूं।PHP

अब मैं अपनी स्क्रिप्ट $_SERVER['HTTP_IF_MODIFIED_SINCE'] और $_SERVER['HTTP_IF_NONE_MATCH'] का उत्तर देने में सक्षम होना चाहता हूं। जब शर्तें मेल खाते हैं, तो मैं ग्राहकों को HTTP 304 "Not Modified" का उत्तर देना चाहता हूं।

सही स्थितियां क्या हैं? जब मैं पूरी सामग्री के बजाय 304 जारी करता हूं?

स्वीकार किए जाते हैं जवाब सवाल How to know when to send a 304 Not Modified response में यह सही ढंग से जारी करने के लिए लगता है, लेकिन मैं बंदरगाह है कि PHP 5.

करने के लिए कोड धन्यवाद करने के लिए कठिन समय है!

उत्तर

27

मैं हमेशा उपयोग किया है:

function caching_headers ($file, $timestamp) { 
    $gmt_mtime = gmdate('r', $timestamp); 
    header('ETag: "'.md5($timestamp.$file).'"'); 
    header('Last-Modified: '.$gmt_mtime); 
    header('Cache-Control: public'); 

    if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) || isset($_SERVER['HTTP_IF_NONE_MATCH'])) { 
     if ($_SERVER['HTTP_IF_MODIFIED_SINCE'] == $gmt_mtime || str_replace('"', '', stripslashes($_SERVER['HTTP_IF_NONE_MATCH'])) == md5($timestamp.$file)) { 
      header('HTTP/1.1 304 Not Modified'); 
      exit(); 
     } 
    } 
} 

याद नहीं है कि क्या मैं इसे लिखा था या कहीं और से यह मिल गया ...

मैं सामान्य रूप से इस तरह से एक फ़ाइल के शीर्ष पर यह उपयोग कर रहा हूँ:

caching_headers ($_SERVER['SCRIPT_FILENAME'], filemtime($_SERVER['SCRIPT_FILENAME'])); 
+1

ग्रेट फ़ंक्शन! वास्तव में! यह मेरा दिन बचाया! – Industrial

+4

अच्छा काम रिच! थोड़ा और सुस्पष्ट: 'कैशिंग_हेडर (__FILE__, फ़ाइलटाइम (__ फ़ाइल __));'। – Julian

+1

वास्तव में सहायक! कोशिश की लेकिन कई अनुरोधों को वैकल्पिक रूप से 200 और 304 प्रदान करते हैं। "ईटाग" परिभाषा के बाद "अंतिम-संशोधित" और "कैश-कंट्रोल" को स्थानांतरित करना इसे ठीक करता है। –

0

ग्राहक एक सशर्त GET अनुरोध प्रदर्शन किया जाता है गया है और पहुँच अनुमति दी है, लेकिन दस्तावेज़ संशोधित नहीं किया गया है, सर्वर चाहिए इस स्थिति कोड के साथ जवाब देते हैं। 304 प्रतिक्रिया एक संदेश-शरीर शामिल नहीं करना चाहिए, और इस तरह हमेशा पहले खाली पंक्ति हेडर फील्ड के बाद इन्हें समाप्त है।

से - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5

इसलिए, यदि आप भेजने के एक 304 शरीर नहीं भेजते हैं।

+0

मुझे पता है कि मेरा प्रश्न इस बारे में नहीं है ... मेरा सवाल है कि मैं 304 भेजता हूं ... – AlexV

+0

क्या आपका मतलब है, php स्क्रिप्ट में किस बिंदु पर? – user151841

+0

आह क्षमा करें, धीमा होना चाहिए, =] –

3

जो उत्तर आप संदर्भित कर रहे हैं वह आपको लगता है कि इसमें आपकी आवश्यकता है। संक्षेप में:

  • ,, अपने खुद के ETag और Last-Modified हेडर उत्पन्न देंगे जैसे कि आपने यदि संशोधित के बाद से शीर्ष लेख ग्राहक भेजा पर पूरे शरीर को भेजने की जाएगी
  • देखो अगर अपनी खुद की last- संशोधित पुराना है या वही 304
  • क्लाइंट के इफ़-नो-मैच हेडर को देखें, यदि यह आपके स्वयं के ईटीएजी से मेल खाता है तो 304
  • भेजें यदि आप इस स्थान तक पहुंचते हैं, तो हेडर मेल नहीं खाते हैं, भेजते हैं पूरा शरीर और नए ETag/Last-Modified हेडर
1

यहां मेरे render_file() फ़ंक्शन का एक स्निपेट है।

$last_modified = filemtime($filename); 
if ($last_modified === false) { 
    throw new Exception('Modify date unknown'); 
} 
if (array_key_exists('HTTP_IF_MODIFIED_SINCE', $_SERVER)) { 
    $if_modified_since = strtotime(preg_replace('/;.*$/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE'])); 
    if ($if_modified_since >= $last_modified) { // Is the Cached version the most recent? 
    header($_SERVER['SERVER_PROTOCOL'].' 304 Not Modified'); 
    exit(); 
    } 
} 
header('Last-Modified: '.date('r', $last_modified)); // tz should be GMT according to specs but also works with other tzs 

// other headers and contents go here 
+0

और HTTP_IF_NONE_MATCH के बारे में क्या? यह आपके स्निपेट में कहां लगाया जा सकता है? – AlexV

+1

संशोधन-दिनांक मेरे लिए पर्याप्त सत्यापन था, एटाग की गणना (सामग्री md5/sha1 के लिए चेकसम) कुछ सर्वर-ओवरहेड उत्पन्न करता है। हालांकि, etags कम त्रुटिप्रणाली हैं। यदि सामग्री शुद्धता महत्वपूर्ण है IF_NONE_MATCH पहले जांचें। यदि IF_NONE_MATCH सेट नहीं है, तो IF_MODIFIED_SINCE की जांच करें। अगर etag मेल नहीं खाता है IF_MODIFIED_SINCE की जांच न करें। क्योंकि आप जानते हैं कि ब्राउज़र कैश अमान्य है! बस 304 हेडर भेजें और बाहर निकलें() –

-3

क्यों?

विषय पर अनुसंधान के एक बहुत कुछ किया करने के बाद मैंने पाया कि सशर्त अनुरोध वास्तव में एक साइट को धीमा। कुछ परिदृश्य हैं जहां यह मामला नहीं है, लेकिन आम तौर पर सामान्य उपयोग पैटर्न पर मैपिंग के परिणामस्वरूप यह कम थ्रूपुट और कम प्रभावी कैशिंग में परिणाम देता है।

सी

+0

यह साइट को धीमा क्यों करेगा। मैं यह भी कल्पना नहीं कर सकता कि यह कैसे धीमा हो जाएगा (यह आप उचित कैश हेडर भेजते हैं) ... – AlexV

+1

उस प्रश्न का संक्षिप्त उत्तर टेक्स्ट और ग्राफ के लगभग 5 पृष्ठ हैं। मैं इसे कहीं इंटरनेट पर रखने का अर्थ रखता हूं ..... इस जगह को देखें। – symcbean

+0

यह देखना दिलचस्प होगा :) – AlexV

0

This article कैशिंग

पर अपने सभी सवालों का जवाब देंगे मैंने पाया कि

RewriteRule .* - [E=HTTP_IF_MODIFIED_SINCE:%{HTTP:If-Modified-Since}] 
RewriteRule .* - [E=HTTP_IF_NONE_MATCH:%{HTTP:If-None-Match}] 

जोड़ने मेरी htaccess फ़ाइल के नीचे (सभी rewriterule के नीचे) काम किया।

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

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