Burada kafa karıştırıcı olan şey, ayarın bazı özel sözdizimiyle bir tamsayı gibi görünmesi, ancak dahili olarak bir dize olarak tanımlanmasıdır. Daha sonra değer her değiştiğinde dize ayrı bir genel değişkene ayrıştırılır . Çok önemli bir şekilde, dizeyi bir tamsayıya ayrıştırma sonucu tekrar ayarlar tablosuna kaydedilmez, bu nedenle aradığınızda phpinfo()
, ayrıştırılan değeri değil orijinal girdiyi görürsünüz.
Bunu kaynakta görebilirsiniz:
Desteklenen sözdizimi nihayetinde tanımlanır zend_atol
:
- ek metni yoksayarak dizeyi sayısal bir değer için ayrıştırır
- dizesinin son karaktere bakar ve çarpar önceki değeri ise
g
, G
, m
, M
, k
, veyaK
Başlangıçta rakam içermeyen bir değer sıfır olarak ayrıştırılır. Global değişkeni ayarlarken, bu, bellek sınırını sabite bağlı olarak izin verilen minimum değere ayarlar ZEND_MM_CHUNK_SIZE
.
Bellek sınırını ayarladıktan sonra hızlı bir şekilde büyük miktarda bellek ayıran ve hata mesajında ne olduğunu görerek bir döngü çalıştırarak efekti görebilirsiniz. Örneğin:
# 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