Yang membingungkan di sini adalah bahwa pengaturannya terlihat seperti integer dengan beberapa sintaks khusus, tetapi secara internal didefinisikan sebagai string. String kemudian diuraikan menjadi variabel global yang terpisah setiap kali nilainya diubah. Yang terpenting, hasil parsing string ke integer tidak disimpan kembali ke tabel pengaturan, jadi ketika Anda menelepon phpinfo()
, Anda melihat input asli, bukan nilai parsing.
Anda dapat melihat ini di sumber:
Sintaks yang didukung pada akhirnya ditentukan di zend_atol
mana:
- mem-parsing string untuk nilai numerik, mengabaikan teks tambahan apa pun
- terlihat pada karakter terakhir dari string, dan mengalikan nilai sebelumnya jika
g
, G
, m
, M
, k
, atauK
Nilai tanpa digit di awal akan diuraikan sebagai nol. Saat mengatur variabel global, ini akan mengatur batas memori ke minimum yang diizinkan, berdasarkan konstanta ZEND_MM_CHUNK_SIZE
.
Anda dapat melihat efeknya dengan menetapkan batas memori, kemudian menjalankan loop yang dengan cepat mengalokasikan sejumlah besar memori dan melihat apa yang keluar dalam pesan kesalahan. Contohnya:
# 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