क्या PHP php.ini फ़ाइल पर कोई पार्सिंग करता है?


24

आरएचईएल 7.7 के तहत PHP संस्करण 7.1.30 चलाना।

मैं memory_limit को टक्कर देना चाहता हूं, लेकिन अगर मुझे वाक्य रचना अधिकार (यानी 256M या 256MB) था तो यकीन नहीं था। तो मैं के साथ शुरू करने के लिए एक बुरा मान "Hugo" के रूप में memory_limit सेटिंग। इस के साथ मुसीबत phpinfo () (httpd के तहत रन) का परिणाम है कि सचमुच स्ट्रिंग "ह्यूगो" जगह में है, अर्थात:

यहां छवि विवरण दर्ज करें

तो यह मुझे कुछ चिंतित है कि PHP वास्तव में मूल्य (ओं) के लिए किसी भी पवित्रता की जाँच नहीं करता है। (यदि प्रदान किया गया मूल्य खराब था, तो मैं यह उम्मीद करूंगा कि यह डिफ़ॉल्ट रूप से वापस आ जाए, उदाहरण के लिए)

क्या कोई इस पर टिप्पणी कर सकता है - विशेष रूप से, आप कैसे जानते हैं कि क्या PHP चीजों को लागू करेगा (यदि एक मध्यस्थ स्ट्रिंग प्रदान किया जा सकता है)।


4
बहुत बढ़िया सवाल।
tink

3
इससे: php.net/manual/en/faq.using.php#faq.using.shorthandbytes मैं मानूंगा कि यह उसी तरह है (int) 'HUGO'; // => 0। जो 2MB मेमोरी में इस्तेमाल की गई मेरी मशीन पर फेल होने लगती है।
योशी


@ योशी मुझे लगता है कि आपको अपना जवाब सार्वजनिक करना चाहिए। यह एक अच्छी व्याख्या है
मेक्सिकम फेडोरोव

@MaksymFedorov मैं संकोच के रूप में मैं अपनी धारणा के लिए कोई वास्तविक संदर्भ है। अभी के लिए यह केवल एक अवलोकन है।
योशी

जवाबों:


19

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

आप इसे स्रोत में देख सकते हैं:

समर्थित सिंटैक्स अंततः परिभाषित किया गया है zend_atol, जिसमें:

  1. किसी भी अतिरिक्त पाठ को अनदेखा करते हुए, एक संख्यात्मक मान के लिए स्ट्रिंग को पार्स करता है
  2. स्ट्रिंग के अंतिम वर्ण को देखता है, और पलता पूर्ववर्ती मूल्य यह है अगर g, G, m, M, k, याK

प्रारंभ में बिना अंक वाले मूल्य को शून्य के रूप में पार्स किया जाएगा। वैश्विक चर को सेट करते समय, यह मेमोरी की सीमा को न्यूनतम अनुमति देता है, जो स्थिरांक पर आधारित होता है ZEND_MM_CHUNK_SIZE

आप मेमोरी सीमा सेट करके प्रभाव देख सकते हैं, फिर एक लूप चला रहे हैं जो जल्दी से बड़ी मात्रा में मेमोरी आवंटित करता है और यह देखकर कि त्रुटि संदेश में क्या आता है। उदाहरण के लिए:

# Invalid string; sets to compiled minimum
php -r 'ini_set("memory_limit", "HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted

# Number followed by a string; takes the number
php -r 'ini_set("memory_limit", "4000000 HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4000000 bytes exhausted

# Number followed by a string, but ending in one of the recognised suffixes
# This finds both the number and the suffix, so is equivalent to "4M", i.e. 4MiB
php -r 'ini_set("memory_limit", "4 HUGO M"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4194304 bytes exhausted

उस महान मूल्यांकन के लिए @IMSoP को धन्यवाद। क्या किसी भी प्रकार के बगट्रैकर में इस तरह की रिपोर्ट करनी चाहिए? मुझे लगता है कि प्रतिक्रिया phpinfo () अत्यधिक जवाबी सहज ज्ञान युक्त पैदा करता है। और जब यह अप्रत्याशित मानों का सामना करता है, तो php क्या करता है, इसके लिए कुछ डिबग आउटपुट या तो एमिस नहीं जाएगा।
tink

1
@tink मुझे लगता है कि आप Bugs.php.net पर एक सुविधा अनुरोध बढ़ा सकते हैं , या इंटरनल्स मेलिंग सूची में एक संदेश भेज सकते हैं, जहां सबसे अधिक समन्वय होता है। मुझे कई साल पहले इसी तरह का अनुरोध मिला था , लेकिन ऐसा लगता नहीं है कि कोई प्रतिक्रिया हुई।
IMSoP

फिर से धन्यवाद, उस पर गौर करेंगे! :)
tink

0

सबसे पहली बात, हमें पहले यह समझने की जरूरत है कि PHP.ini व्याख्या वर्कफ़्लो के तरीके से कैसे काम करती है। PHP के लिए memory_limit निर्देश है।

PHP फ़ंक्शन के साथ उपयोग करते समय आपको ऐसा कुछ करना होगा ini_set(‘memory_limit’,’256MB’)। इसलिए, यह फ़ंक्शन अस्थायी रूप से दुभाषिया चर के लिए आपके मूल्य को निर्धारित करेगा। यदि आप करीब देखते हैं तो आप दो कॉलम पा सकते हैं एक लोकल के लिए है और एक ग्लोबल के लिए है। यह क्रमशः व्यक्ति को मूल्यों की क्षमता दिखाता है।

लेकिन, जब आपने वैश्विक रूप से परिभाषित किया, तो आपको क्रमशः के, एम, जी के साथ एक प्रत्यय के रूप में स्थापित करने की आवश्यकता है। यदि हम अपाचे का उपयोग करके इस मूल्य को पार कर जाते हैं। तो इसे PHP fpm के लिए समान होना चाहिए।


3
मैं विनम्रतापूर्वक कहना चाहूंगा कि ओपी यह नहीं पूछ रहा है कि मेमोरी की सीमा कैसे तय करें :)
करोलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.