2008-09-04 17 views

उत्तर

9

अपाचे इनोड-फाइलसाइज-एमटाइम के मानक प्रारूप का उपयोग करता है। इसका एकमात्र चेतावनी यह है कि mtime युग का समय होना चाहिए और शून्य के साथ गद्दी होना चाहिए ताकि यह 16 अंक हो। यहां PHP:

$fs = stat($file); 
header("Etag: ".sprintf('"%x-%x-%s"', $fs['ino'], $fs['size'],base_convert(str_pad($fs['mtime'],16,"0"),10,16))); 
+1

क्यों नहीं हैडर (sprintf ('Etag: "% x-% x-% 016x"', $ fs ['ino'], $ fs ['size'], $ fs ['mtime'])) ; '? –

+1

मैंने देखा कि मेरे अपाचे सर्वर के ईटाग का एमटीआईएम हिस्सा वास्तव में एक बहुत सटीक एमटीआईएम है, यह माइक्रोसॉन्ड का भी उपयोग करता है। तो अगर आप एटैग को ठीक तरह से उत्पन्न करना चाहते हैं जैसे अपाचे करता है तो आपको mtime के microtime की आवश्यकता होगी। मेरे ज्ञान के लिए PHP में यह संभव नहीं है। हालांकि आप यह कर सकते हैं कि अपाचे का एमटीएम _ _ पर्याप्त है (<1 सेकंड), तो आप कम से कम '304 संशोधित नहीं' कर सकते हैं। – Halcyon

1

यदि आप गतिशील रूप से अपना पृष्ठ बना रहे हैं, तो शायद यह समझ में नहीं आता है। यदि आप PHP में हैं, तो आप मुख्य स्क्रिप्ट का इनोड और फ़ाइल आकार चुन सकते हैं, लेकिन संशोधित समय आपको नहीं बताएगा कि आपका डेटा बदल गया है या नहीं। जब तक आपके पास अच्छी कैशिंग प्रक्रिया न हो या केवल स्थिर पृष्ठ उत्पन्न न करें, तो etags सहायक नहीं हैं। यदि आपके पास अच्छी कैशिंग प्रक्रिया है, तो इनोड और फ़ाइल का आकार शायद अप्रासंगिक है।

संपादित करें: उन लोगों के लिए जो etag एस नहीं जानते हैं - वे केवल एक मूल्य मानते हैं जो सामग्री बदलते समय बदलते हैं, कैशिंग उद्देश्यों के लिए। ब्राउज़र को वेब सर्वर से एटैग मिल जाता है, इसकी कैश की गई प्रतिलिपि के लिए इसे एटैग से तुलना करता है और फिर ईटैग बदल गया है तो पूरे पृष्ठ को प्राप्त करता है।

+0

यह दृष्टिकोण डाउनलोड स्क्रिप्ट जैसे चीजों के लिए उपयोगी हो सकता है जो केवल PHP और अन्य स्थितियों के माध्यम से फ़ाइलों को स्ट्रीम करता है जहां प्रतिक्रिया वास्तव में प्रति-अनुरोध गतिशील नहीं होती है। –

2

अपाचे के इटैग्स के बारे में याद रखने की एक बात यह है कि वे क्लस्टर में अच्छी तरह से नहीं खेलते हैं क्योंकि उनमें इनोड जानकारी शामिल होती है जो संभवतः एक ही क्लस्टर में मशीनों के बीच भिन्न हो सकती है।

+3

एटाग इनोड को स्वतंत्र बनाने के लिए अपने .htaccess में 'FileETag MTime Size' जोड़ें। – Halcyon

+0

अपाचे संस्करण 2.4 में, इनोड डिफ़ॉल्ट रूप से अब शामिल नहीं है। – holmis83

1

ऊपर (क्रिस) से अच्छी तरह से काम करता है, लेकिन sprintf में एक अंतर्निहित कलाकारों का उपयोग कर सरल किया जा सकता जवाब:

sprintf('"%x-%x-%x"', $s['ino'], $s['size'], str_pad($s['mtime'], 16, "0")); 

सुझाव दिया क्योंकि गद्दी लागू किया जाता है %016x काम नहीं करता है के बाद रूपांतरण हेक्स के लिए , पहले की बजाय।

+0

यह ** ** काम नहीं करता है, मुझे यकीन नहीं है क्यों, क्योंकि% x को इनपुट के रूप में 'int' की आवश्यकता है? – Halcyon

+1

@ फ़्रिट्स्वानकंपेन: यह उससे थोड़ा अधिक जटिल हो गया है। 'sprintf' स्ट्रिंग को' int 'पर डालने का प्रयास करेगा, लेकिन चूंकि ये संख्याएं इतनी बड़ी हैं कि वे बहती हैं और समस्याएं पैदा करती हैं। समाधान इसके बजाय 'फ्लोट' का उपयोग करना है: 'sprintf (' "% x-% x-% x '', $ s ['ino'], $ s ['size'], (float) str_pad ($ s [ 'माटा'], 16, '0')) '। –

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