2009-08-23 12 views
7

मुझे पता है कि हम आसानी से किसी भी http अनुरोध शीर्ष पर एक रिवाइटकंड का आधार बना सकते हैं। लेकिन क्या हम प्रतिक्रिया हेडर भेजने के लिए जा रहे हैं (कुछ) की जांच कर सकते हैं? विशेष रूप से, अंतिम-संशोधित एक?mod_rewrite रीवाइटकॉन्ड अंतिम-संशोधित पर आधारित है? (.htaccess)

मैं केवल यूआरएल को फिर से लिखना चाहता हूं जब अंतिम संशोधित दिनांक 30 मिनट से अधिक पुराना हो और मैं प्रतिनिधि के ओवरहेड से बचने की कोशिश कर रहा हूं जो उस निर्देशिका से फ़ाइल को हर बार एक php फ़ाइल में जांचने का अनुरोध करता है।

अग्रिम धन्यवाद!

उत्तर

0

आउटबाउंड हेडर much तक mod_rewrite के बाद तक मौजूद नहीं है। mod_rewrite में निर्मित कोई फ़ाइल-संशोधन-समय जांच कार्यक्षमता भी नहीं है, इसलिए आप इसका उपयोग करने के सबसे नज़दीक बाहरी रिवाइटिंग प्रोग्राम किस्म के RewriteMap को यह पता लगाने के लिए कर रहे हैं कि प्रश्न में फ़ाइल संशोधित की गई है या नहीं।

यदि मैं आपके आवेदन को सही ढंग से समझता हूं, तो आप 30 मिनट से अधिक पुरानी निर्देशिका में क्रॉन जॉब फ़ाइलों को हटा सकते हैं, और फिर फ़ाइल-नोएक्सिस्टेंस स्थिति पर फिर से लिखना चाहते हैं।

+0

जाहिर है, हाँप। लेकिन उस समय अंतिम संशोधित शीर्षलेख मौजूद है, इसलिए मैंने सोचा कि शायद इसके लिए कुछ है। मुझे लगता है कि नहीं है :-( क्रॉन के लिए, यह वही है जो मैं टालने की कोशिश कर रहा हूं। –

8

नहीं, यह संभव नहीं है। लेकिन आप PHP से कम ओवरहेड वाले प्रोग्राम से उस जानकारी को प्राप्त करने के लिए rewrite map का उपयोग कर सकते हैं, शायद एक शेल स्क्रिप्ट।

यहाँ एक उदाहरण बैश स्क्रिप्ट है:

#!/usr/bin/env bash 
while read line; do 
    max_age=${line%%:*} 
    filename=${line#*:} 
    if [[ -f $filename ]]; then 
     lm=$(stat -f %m "$filename") 
     if [[ $(date +%s)-$lm -le $max_age ]]; then 
      echo yes 
     else 
      echo no 
     fi 
    else 
     echo no 
    fi 
done 

पुनर्लेखन मानचित्र की घोषणा की जरूरत है अपने सर्वर या वर्चुअल होस्ट कॉन्फ़िगरेशन फ़ाइल में रखा जा रहा के रूप में कार्यक्रम सिर्फ एक बार शुरू कर दिया जाता है और फिर निवेश के लिए इंतजार कर रहा है:

RewriteMap last-modified-within prg:/absolute/file/system/path/to/last-modified-within.sh 

और फिर आप इस (.htaccess उदाहरण) की तरह है कि फिर से लिखने के लिए मानचित्र का उपयोग कर सकते हैं:

RewriteCond %{last-modified-within:30:%{REQUEST_FILENAME}} =yes 
RewriteRule ^foo/bar$ - [L] 
RewriteRule ^foo/bar$ script.php [L] 
+0

अच्छा समाधान या वहां गया। –

+0

चूंकि PHP पहले ही लोड हो चुका है और अपाचे प्रक्रिया के अंदर चल रहा है, यह बिल्कुल स्पष्ट नहीं है कि एक नया बैश - एक प्रति अनुरोध - तेजी से होगा। मुझे लगता है कि यह नहीं है। – derobert

+0

वाह, यह स्मार्ट है! अपने व़क्त के लिए बहुत - बहुत शुक्रिया। हालांकि, ऊपर डेरोबर्ट के आपत्ति के बारे में क्या? –

0

क्या आपने mod_proxy, mod_cache, और/या squid का उपयोग करने पर विचार किया है? ऐसा लगता है कि आप अपना खुद का कैशिंग रोल करने की कोशिश कर रहे हैं ...

+0

हाँ, मैं कुछ php/gd जेनरेट की गई छवियों को कैश करने की कोशिश कर रहा हूं और यदि आवश्यक हो तो उन्हें हर 30 मिनट में पुन: बनाना (= अगर कोई वास्तव में उनसे अनुरोध करता है)। आपको लगता है कि mod_proxy, mod_cache या squid मदद कर सकता है? मैंने कभी भी उन्हें वास्तव में स्पष्ट रूप से देखने में नहीं देखा है। मैंने हमेशा सोचा कि वे अधिक जटिल चीजों के लिए हैं। –

+0

हां, आप वेब कैशिंग कर रहे हैं , और यह वही है जो उनके लिए लक्षित हैं। स्वाभाविक रूप से, यदि आप महत्वपूर्ण हैं तो आपको केवल इस अनुकूलन से परेशान होना चाहिए (उदाहरण के लिए, आपके पास ट्रैफिक वॉल्यूम की आवश्यकता है)। – derobert

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