mod_perl स्क्रिप्ट के नाम और पथ के आधार पर पैकेज के भीतर handler
नामक एक उपराउटिन में प्रत्येक पर्ल स्क्रिप्ट को लपेटकर काम करता है। प्रत्येक स्क्रिप्ट को चलाने के लिए एक नई प्रक्रिया शुरू करने के बजाय, यह handler
सबराउटिन को लगातार पर्ल थैड्स में से एक द्वारा बुलाया जाता है।
आमतौर पर इस ज्ञान mod_cgi से पर्यावरण में परिवर्तन को समझने के लिए बहुत मदद मिलेगी, लेकिन जब से तुम कभी नहीं किया है, आपकी कार्यक्रमों के लिए use strict
और घोषित चर के कामकाज से परिचित आपको बस इतना करना लोकप्रिय हो रहा का एक बहुत है बन !
मोड-पर्ल पर्यावरण गैर स्पष्ट सुरक्षा उल्लंघनों के कारण के लिए क्षमता है, और आप हर स्क्रिप्ट पर use strict
के लिए अब शुरू करते हैं और घोषित हर चर चाहिए। use Carp
आपको त्रुटि लॉग को समझने में भी मदद करेगा।
our
के साथ घोषित एक वैरिएबल नाम एक ही नाम के पैकेज वैरिएबल के लिए एक व्याख्यात्मक-स्कोप्ड समानार्थी है जिसका उपयोग पैकेज नाम सहित नाम को पूरी तरह अर्हता प्राप्त किए बिना किया जा सकता है। उदाहरण के लिए, आमतौर पर our $var
के साथ घोषित एक चर $main::var
स्केलर तक पहुंच प्रदान करेगा (यदि घोषणा नहीं है) main::
निर्दिष्ट किए बिना। हालांकि, ऐसे चर जो undef
के mod_cgi में mod_perl थ्रेड के पिछले निष्पादन से अपने मान बनाए रखेंगे, और निरंतरता के लिए हमेशा घोषणा के बिंदु पर उन्हें प्रारंभ करना सुरक्षित है। ध्यान दें कि mod_perl रैपिंग के कारण डिफ़ॉल्ट पैकेज नाम अब main
नहीं है, इसलिए आप main::
उपसर्ग का उपयोग करके पैकेज चर का उपयोग नहीं कर सकते हैं, और पैकेज के वास्तविक नाम को खोजने के लिए मूर्खतापूर्ण है और स्पष्ट रूप से इसका उपयोग करें क्योंकि यह बहुत लंबा नाम होगा और यदि आप अपनी स्क्रिप्ट को स्थानांतरित या नाम बदलते हैं तो बदल जाएगा।
ए my
वैरिएबल वह है जो पैकेज प्रतीक तालिका से स्वतंत्र रूप से मौजूद है, और आम तौर पर इसका जीवनकाल संलग्न फ़ाइल (फाइल स्कोप पर घोषित चर के लिए) या सबराउटिन का रन टाइम होता है। वे mod_perl में सुरक्षित हैं यदि दोनों स्क्रिप्ट के फ़ाइल दायरे में या पूरी तरह से एक सबराउटिन के भीतर पूरी तरह से उपयोग किए जाते हैं और उपयोग करते हैं, लेकिन यदि आप स्कॉप्स को मिश्रित करते हैं और फ़ाइल स्कोप पर my $global
घोषित करते हैं और फिर इसे सबराउटिन में उपयोग करने का प्रयास करते हैं तो आप स्टंग हो सकते हैं। इसका कारण सरल नहीं है, लेकिन mod_perlhandler
सबराउटिन में आपकी स्क्रिप्ट को लपेटने के कारण होता है, इसलिए आपके पास सबराउटिन घोषणाएं घोंसला होती हैं। आंतरिक subroutine केवल $global
के पहले तात्कालिकता को अपनाने और बाद में कॉल द्वारा बनाए गए किसी भी अन्य को handler
पर अनदेखा कर देगा। यदि आपको वैश्विक चर की आवश्यकता है तो आपको इसे our
के साथ घोषित करना चाहिए और ऊपर वर्णित अनुसार घोषणा में इसे आरंभ करना चाहिए।
ए local
वैरिएबल our
वैरिएबल जैसा है कि यह एक पैकेज चर के पर्याय का पर्याय बनता है। हालांकि यह अस्थायी रूप से उस चर के वर्तमान मूल्य को बचाता है और फ़ाइल या ब्लॉक स्कोप के अंत तक उपयोग के लिए एक नई प्रति प्रदान करता है। अपने स्वचालित निर्माण और इसके दायरे में हटाने के कारण mod_perl स्क्रिप्ट्स में विशेष रूप से जहां आप डेटा संरचनाओं के पॉइंटर्स का उपयोग कर रहे हैं, कहें, CGI
कक्षा का उदाहरण उदाहरण के लिए यह उपयोगी विकल्प हो सकता है। our $cgi = CGI->new
घोषित करना सही ढंग से ऑब्जेक्ट बना देगा, लेकिन mod_perl के दृढ़ता के कारण, इसे स्मृति में तब तक छोड़ देगा जब तक कि थ्रेड के अगले निष्पादन को किसी अन्य के लिए जगह बनाने के लिए हटा दिया न जाए।
अपने प्रश्नों के लिए के रूप में:
एक चर का उपयोग करना यह या तो घोषित करने के बिना एक संकलन समय त्रुटि होती है यदि use strict
जगह के रूप में यह होना चाहिए है। अन्यथा यह वर्तमान पैकेज नामस्थान में उस चर के लिए समानार्थी है।
चर या तो पैकेज चर या लेक्सिकल चर हैं; निजी जैसे चर को घोषित करने का कोई तरीका नहीं है। लेक्सिकल वैरिएबल (my
के साथ घोषित) को स्क्रिप्ट के प्रत्येक निष्पादन के साथ बनाया और नष्ट कर दिया जाएगा, जब तक कि आपने एक अमान्य क्लोजर को उपरोक्त वर्णित एक सबराउटिन लिखकर ऊपर वर्णित किया है, जो एक विस्तृत दायरे में घोषित चर का उपयोग करता है, जब चर होगा लगातार लेकिन वह नहीं करेगा जो आप चाहते हैं। our
के साथ घोषित एक वैरिएबल स्क्रिप्ट को कॉल में अपना मान बरकरार रखेगा, जबकि स्क्रिप्ट समाप्त होने पर local
के साथ घोषित किया जाएगा। our
और local
चर दोनों पैकेज चर हैं और समान चर नाम के सभी संदर्भ समान चर को संदर्भित करते हैं।
एक वेरिएबल घोषित करने के लिए जो किसी भी स्क्रिप्ट के किसी भी कॉल के भीतर लगातार पहुंच योग्य है, आप या तो local
चर या प्रारंभिक our
चर का उपयोग कर सकते हैं। फ़ाइल स्कोप local $global
पर mod_perl स्क्रिप्ट के लिए our $global = undef
के बराबर है। यदि आप डेटा संरचना को इंगित करने के लिए our
चर का उपयोग करते हैं तो undef $global
के साथ स्क्रिप्ट के अंत में इसे नष्ट करना याद रखें।
my
चर के लिए अद्वितीय है, और भीतर, ब्लॉक, जिसमें वे घोषित किया गया है दिखाई दे रहे हैं, कि एक if
, while
या for
, या यहाँ तक कि सिर्फ एक नंगे { ... }
ब्लॉक दायरे के भीतर एक ब्लॉक है या नहीं। अस्थायी कार्य चर के लिए हमेशा my
चर का उपयोग करें जो केवल एक ब्लॉक के भीतर उपयोग किए जाते हैं और कहीं और से नहीं पहुंचते हैं।
मुझे आशा है कि इस मदद करता है
जब तक आप विशेष रूप से, अपाचे की हिम्मत के साथ इंटरफेस करने की जरूरत है आप सिर्फ बातें तेजी लाने के लिए, मोड-पर्ल लंघन और [Plack] (https करने के लिए सीधे आगे बढ़ने पर विचार करना चाहते हैं: // metacpan.org/module/Plack) और फास्टसीजीआई। mod_perl आपको अपाचे से जोड़ता है, पूरी HTTP प्रक्रिया को फहराता है और स्मृति को रिसाव कर सकता है। कई पर्ल वेब ढांचे बेकार के साथ काम करते हैं। हालांकि, वैश्विक बनाम अक्षीय चर के साथ इसी तरह के मुद्दे हैं, इसलिए आपका प्रश्न प्रासंगिक बना हुआ है। – Schwern
@ ज़िलो: आप बहुत चुप हो गए हैं। क्या इनमें से कोई भी जवाब आपको बताता है कि आपको क्या जानने की आवश्यकता है? – Borodin
@Schwern मैंने लाइटसीपीआई पर फास्टसीजीआई चलाने की कोशिश की है लेकिन सेटअप करना आसान नहीं था।मैं Lighttpd पर PHP के लिए फास्टसीजीआई का उपयोग कर रहा हूं लेकिन पर्ल स्क्रिप्ट को संभालने के लिए फास्टसीजीआई स्थापित करने के लिए और अधिक जटिल लगता है। – Zillo