2011-07-12 17 views
8

के साथ अपाचे रिवाइटमैप को समझना मैंने काफी भारी ड्यूटी एलएएमपी आवेदन के विकास को संभाला है। मूल देव ने ऐप की कुछ स्थितियों को संभालने के लिए रिवाइटमैप और एक PHP स्क्रिप्ट के साथ एक .htaccess फ़ाइल का उपयोग किया।रिवाइट लॉक

विशेष रूप से, जब ग्राहक द्वारा कुछ सबडोमेन पैटर्न का अनुरोध किया जाता है, तो रिवाइटमैप उन्हें पकड़ता है और उन्हें उचित अनुप्रयोग मॉड्यूल में भेजता है।

मैं सामान्य mod_rewrite रीडायरेक्ट के साथ काफी सहज हूं, और मुझे लगता है कि मुझे मूल रिवाइटमैप अवधारणा का पता चला है; लेकिन मैं रिवाइट लॉक कैसे काम करता है इस पर सभ्य दस्तावेज़ीकरण खोजने के लिए संघर्ष कर रहा हूं। अपाचे डॉक्स के अनुसार:

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

लेकिन यह अभी भी मेरे लिए थोड़ा अस्पष्ट है। रेवाइट लॉक का सटीक उद्देश्य और कार्य क्या है और यह कैसे काम करता है?

+0

+1 इस Mod_Rewrite के सबसे खराब समझाया पहलुओं मैं अभी तक देखा है में से एक है। – puk

उत्तर

3

रिवाइट लॉक prg: कीवर्ड के साथ उपयोग किया जाता है। रीवाइटमैप टेक्स्ट फ़ाइलों (txt:), हैशफ़ाइल (dbm:), यादृच्छिक पाठ (rnd:) या बाहरी मैपिंग स्क्रिप्ट्स (यह prg: कीवर्ड) का उपयोग करने के लिए कई कीवर्ड के साथ उपयोग किया जा सकता है। इस मोड में अपाचे शुरू होने पर बाहरी स्क्रिप्ट लॉन्च की जाती है। फिर प्रत्येक आने वाले अनुरोध के लिए, जब mod-rewrite prg: मानचित्रण को कॉल कर रहा है, तो अपाचे उस स्क्रिप्ट में इनपुट भेजता है और मान प्राप्त करने के लिए आउटपुट स्ट्रीम पढ़ता है।

रिवाइट लॉक इस प्रक्रिया में समानांतर अनुरोधों को रोकने के लिए उपयोग किया जाना चाहिए (इसलिए बाहरी प्रक्रिया में समानांतर इनपुट) इस प्रक्रिया मानक आउटपुट पर उत्तर मिश्रण करने के लिए। यह एक बाहरी लॉकिंग तंत्र है (एक फ़ाइल, दिया गया पथ, जो शास्त्रीय टोकन है, केवल एक उपयोगकर्ता है) इस बाहरी मैपिंग स्क्रिप्ट को कॉल के क्रमबद्धता को लागू करने के लिए। आईएमएचओ इसे पीआरजी का उपयोग करते समय पारदर्शी रूप से मॉड-रीराइट द्वारा लागू किया जाना चाहिए: क्योंकि मुझे कभी भी एक प्रिग केस नहीं मिला है जहां यह लॉकिंग चीज अनिवार्य नहीं है

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

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

तो यदि आप केवल हैशैप या टेक्स्टमैप का उपयोग कर रहे हैं तो आपको रिवाइट लॉक सेट करने की आवश्यकता नहीं है।

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

आप इस thread पर उपयोगी जानकारी के मिल सकता है इस तथ्य ताला फ़ाइल में केवल कुछ मिलीसेकंड के लिए मौजूद है, जब अपाचे पीआरजी कॉल करता है और एक जवाब के लिए इंतजार कर रहा है की तरह।

संपादित करें: सवाल एक अजीब तथ्य पर है:

मूल देव RewriteMap

यह अजीब है, क्योंकि RewriteMap पर काम नहीं कर सकते हैं के साथ एक .htaccess फ़ाइल का उपयोग किया। htaccess फ़ाइलें, .htaccess कॉन्फ़िगरेशन प्रविष्टियां गतिशील रूप से पढ़ी जाती हैं और संदर्भ पंक्ति में केवल here बताई गई है मुख्य कॉन्फ़िगरेशन में या वर्चुअलहोस्ट कॉन्फ़िगरेशन में सेट किया जाना चाहिए। यह किसी स्थान, निर्देशिका या एक। Htaccess में नहीं हो सकता है। तो संभावना है कि यह कभी भी .htaccess में काम नहीं करेगा।

अब @puk ने रीवाइटमैप उपयोग के उदाहरण के लिए कहा। ठीक है, "RewriteMap" ढेर अतिप्रवाह में के लिए खोज आप कई वास्तविक उदाहरण दिखाएगा:

+1

यदि आप एक उदाहरण रीवाइट लॉक/रीवाइटमैप स्टेटमेंट पोस्ट करते हैं तो यह पाठकों के लिए उपयोगी हो सकता है। मुझे यह करने के लिए mod_rewrite के साथ पर्याप्त आत्मविश्वास महसूस नहीं होता है। – puk

+0

@puk: कुछ लिंक – regilero

+0

धन्यवाद जोड़ा गया। तीसरा उदाहरण उपयोगी है। हालांकि, मैं विशेष रूप से जानना चाहता था कि क्या किसी को एक रिवाइट लॉक प्रति रिवाइटमैप की आवश्यकता है, भले ही रिवाइट लॉक को रीव्राइट मैप के समान/समान नाम होना चाहिए और क्या इसे किसी विशेष तरीके से घोषित किया जाना चाहिए (यानी तुरंत/बाद में RewriteMap)। ये वे चीजें हैं जिन्हें मैं वेब पर नहीं ढूंढ सकता। – puk

0

अपाचे लटका हुआ है यदि आप एक से अधिक RewriteLock निर्देशों को परिभाषित या यदि आप इसे VHOST कॉन्फ़िगरेशन में उपयोग करते हैं।

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

अधिक जानकारी के लिए यहाँ देखें: http://books.google.com/books?id=HUpTYMf8-aEC&lpg=PP1&pg=PA298#v=onepage&q&f=false

+0

यह गलत लगता है। क्या होगा यदि दो अपाचे थ्रेड एक बार में 'prg' को अनुरोध भेजते हैं? कौन सा जवाब उस अनुरोध पर जाएगा, भले ही आपने उनमें से झुंड() का उपयोग किया हो? यह गलत सुझाव है, इस प्रकार, गलत सुझाव है। कुछ तीसरे संसाधनों के लिए 'prg' की पहुंच को लॉक नहीं किया जाना चाहिए, लेकिन अपाचे की prg तक पहुंच है। – catpnosis

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