यहां भ्रमित करने वाली बात यह है कि सेटिंग कुछ विशेष सिंटैक्स के साथ पूर्णांक की तरह दिखती है, लेकिन आंतरिक रूप से एक स्ट्रिंग के रूप में परिभाषित होती है। जब भी मूल्य परिवर्तित किया जाता है, तब स्ट्रिंग को एक अलग वैश्विक चर में पार्स किया जाता है। महत्वपूर्ण रूप से, स्ट्रिंग को पूर्णांक में पार्स करने का परिणाम सेटिंग टेबल पर वापस सहेजा नहीं गया है, इसलिए जब आप कॉल करते हैं, तो आप phpinfo()
मूल इनपुट देखते हैं, न कि पार्स किया गया मान।
आप इसे स्रोत में देख सकते हैं:
समर्थित सिंटैक्स अंततः परिभाषित किया गया है zend_atol
, जिसमें:
- किसी भी अतिरिक्त पाठ को अनदेखा करते हुए, एक संख्यात्मक मान के लिए स्ट्रिंग को पार्स करता है
- स्ट्रिंग के अंतिम वर्ण को देखता है, और पलता पूर्ववर्ती मूल्य यह है अगर
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