2015-02-18 2 views
6

पीएचपी मैनुअल राज्यों PCRE की "एस" (पैटर्न के अतिरिक्त विश्लेषण) संशोधक के बारे में निम्नलिखित http://php.net/manual/en/reference.pcre.pattern.modifiers.phpPCRE पीएचपी उपयोग और "एस" संशोधक (अतिरिक्त पैटर्न के विश्लेषण) की उपयोगिता की कंक्रीट उदाहरण?

पर एस

जब एक पैटर्न में कई बार इस्तेमाल किया जा रहा है, यह खर्च के लायक है मिलान के लिए पर गए समय को तेज़ करने के लिए इसका अधिक समय विश्लेषण करना। यदि यह संशोधक सेट किया गया है, तो यह अतिरिक्त विश्लेषण किया गया है। वर्तमान में, एक पैटर्न का अध्ययन केवल गैर लंगर पैटर्न है कि एक ही तय शुरू कर चरित्र की जरूरत नहीं है के लिए उपयोगी है।

तो इसके उपयोग पैटर्न में कई बार इस्तेमाल किया जाना चाहिए जो से संबंधित है, उनमें से अंदर लंगर के बिना या एक निश्चित शुरू कर चार अनुक्रम, उदा (जैसे ^, $ के रूप में) '/^abc/' जैसे पैटर्न में।

लेकिन वहाँ जहां उदा पर किसी भी विशिष्ट विवरण नहीं हैं इस संशोधक को लागू करें और यह वास्तव में कैसे काम करता है।

क्या यह केवल वर्तमान निष्पादन स्क्रिप्ट के PHP थ्रेड के लिए लागू होता है और स्क्रिप्ट निष्पादित करने के बाद पैटर्न के "कैश्ड" विश्लेषण खो जाता है? या इंजन एक वैश्विक कैश जो है तो कई पीएचपी धागे उस पैटर्न यह संशोधक के साथ चिह्नित के साथ PCRE उपयोग करने के लिए उपलब्ध कराया में पैटर्न के विश्लेषण की दुकान करता है?

इसके अलावा

, PCRE परिचय से: http://php.net/manual/en/intro.pcre.php

नोट: यह विस्तार संकलित नियमित अभिव्यक्ति का एक वैश्विक प्रति धागा कैश (4096 अप करने के लिए)

हैं "एस" का कहना है संशोधक केवल प्रति थ्रेड का उपयोग किया जाता है, यह संकलित regexps के पीसीआरई कैश से अलग कैसे है? मुझे लगता है कि अतिरिक्त जानकारी संग्रहीत की जाती है, माईएसक्यूएल की तरह कुछ ऐसा करता है जब यह किसी तालिका में पंक्तियों को अनुक्रमित करता है (निश्चित रूप से पीसीआरई के मामले में, यह अतिरिक्त जानकारी स्मृति में संग्रहीत होती है)।

अंतिम, लेकिन कम से कम नहीं, क्या किसी ने वास्तविक उपयोग केस का अनुभव किया है जहां उसने इस संशोधक का उपयोग किया था और क्या आपने कोई सुधार देखा और इसके लाभों की सराहना की?

ध्यान के लिए धन्यवाद।

+1

मुझे पीसीआरई के PHP के उपयोग के कार्यान्वयन विवरण नहीं पता, लेकिन पीसीआरई वी 10 अध्ययन में हमेशा किया जाता है। और पीसीआरई में संकलित रेगेक्स का कोई कैश नहीं है। चेक का अध्ययन करना कि किसी दिए गए पैटर्न के लिए कुछ अनुकूलन संभव हैं या नहीं। –

+0

आपकी टिप्पणी के लिए धन्यवाद, वैसे भी, आप कह रहे हैं कि अध्ययन तंत्र कुछ ऐसा करता है जैसे 'रेगेक्सपी संरचना का विश्लेषण करना और इसे अधिक प्रदर्शन पैटर्न में पुनः लिखना', क्या यह सही है? – tonix

+1

बिल्कुल नहीं। मैं दस्तावेज़ों का उद्धरण दूंगा: * एक पैटर्न का अध्ययन दो चीजें करता है: सबसे पहले, पैटर्न स्ट्रिंग की लंबाई के लिए आवश्यक स्ट्रिंग की लंबाई गणना की गई है। [...] एक पैटर्न का अध्ययन गैर-एंकर पैटर्न के लिए भी उपयोगी है जो में एक निश्चित प्रारंभिक वर्ण नहीं है। बाइट्स शुरू करने के संभावित का बिटमैप बनाया गया है। यह विषय पर एक स्थिति खोजने के लिए गति करता है जिस पर मिलान शुरू करना है। * –

उत्तर

2

पीएचपी डॉक्स PCRE किए गए दस्तावेज़ों की एक छोटा सा हिस्सा बोली। यहां कुछ और जानकारी (जोर मेरा) से PCRE 8.36 हैं:

एक संकलित पैटर्न में कई बार इस्तेमाल किया जा रहा है, तो यह अधिक समय समय के लिए ले जाया तेजी लाने के लिए आदेश में यह विश्लेषण करने खर्च के लायक है मेल मिलाना। फ़ंक्शन pcre_study() संकलित पैटर्न में इसके पहले तर्क के रूप में एक पॉइंटर लेता है। यदि पैटर्न का अध्ययन करने से अतिरिक्त जानकारी मिलती है जो मिलान को तेज करने में मदद करेगी, pcre_study()pcre_extra ब्लॉक पर एक सूचक लौटाता है, जिसमें study_data फ़ील्ड अध्ययन के परिणामों के लिए इंगित करता है।

...पहले एक कम विषय स्ट्रिंग है जो आकार से मिलान करने की जरूरत है की लंबाई के लिए बाध्य की जाती है:

एक पैटर्न का अध्ययन दो काम करता है। इसका मतलब यह नहीं है कि उस लंबाई के किसी भी तार हैं जो मेल खाते हैं, लेकिन यह गारंटी देता है कि कोई छोटा तार मिलान नहीं होता है। मूल्य का उपयोग निम्न सीमा से कम तारों से मेल खाने की कोशिश करके समय बर्बाद करने से बचने के लिए किया जाता है। आप pcre_fullinfo() फ़ंक्शन के माध्यम से एक कॉलिंग प्रोग्राम में मान पा सकते हैं।

एक पैटर्न का अध्ययन गैर-एंकर पैटर्न के लिए भी उपयोगी है जिसमें एक निश्चित प्रारंभिक चरित्र नहीं है। संभव बाइट्स का एक बिटमैप बनाया गया है। यह उस विषय में स्थिति ढूंढने की गति करता है जिस पर मिलान शुरू करना है। (16-बिट मोड में, बिटमैप 16-बिट मूल्यों की तुलना में कम 256 32-बिट मोड में के लिए प्रयोग किया जाता है, बिटमैप 256 से भी कम समय 32-बिट मूल्यों के लिए प्रयोग किया जाता है) ध्यान दें कि

कृपया बाद में पीसीआरई संस्करण (v10.00, जिसे पीसीआरई 2 भी कहा जाता है) में, lib ने एक बड़े पैमाने पर रिफैक्टरिंग और एपीआई रीडिज़ाइन किया है। परिणामों में से एक यह है कि अध्ययन हमेशा पीसीआरई 10.00 और उससे ऊपर में किया गया है। मुझे नहीं पता कि PHP पीसीआरई 2 का उपयोग कब करेगा, लेकिन यह जल्द या बाद में होगा क्योंकि पीसीआरई 8.x अब से कोई नई विशेषताएं नहीं प्राप्त करेगा।

यहाँ PCRE2 release announcment से एक उद्धरण है:

स्पष्ट संकलित पैटर्न के "का अध्ययन" समाप्त कर दिया गया है - यह अब हमेशा आप होता है। pcre2_compile() से सफल वापसी के बाद जेआईटी संकलन एक नया फ़ंक्शन, pcre2_jit_compile() पर कॉल करके किया जाता है।


अपने दूसरे प्रश्न का सवाल है:

"एस" संशोधक प्रति-धागा केवल प्रयोग किया जाता है, यह कैसे संकलित regexps की PCRE कैश से अलग करता है?

PCRE अपने आप में कोई कैश नहीं है, लेकिन पीएचपी मामले में बार-बार एक ही पैटर्न recompiling, उदाहरण के लिए से बचने के लिए आप एक पाश के अंदर एक preg_ फ़ंक्शन का उपयोग regexes की एक कैश रखता है।

+0

उत्तर देने के लिए धन्यवाद! – tonix

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