এখানে বিভ্রান্তকর বিষয়টি হ'ল সেটিংসটি কিছু বিশেষ সিনট্যাক্স সহ একটি পূর্ণসংখ্যার মতো লাগে তবে অভ্যন্তরীণভাবে স্ট্রিং হিসাবে সংজ্ঞায়িত হয়। স্ট্রিংটি পৃথক বৈশ্বিক চলকতে পার্স করা হয় যখনই মান পরিবর্তন হয়। গুরুতরভাবে, একটি পূর্ণসংখ্যার স্ট্রিংকে পার্স করার ফলাফল সেটিংস টেবিলটিতে ফিরে সংরক্ষিত হয় না, সুতরাং যখন আপনি কল করবেন তখন আপনি 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