Смущает то, что настройка выглядит как целое число с некоторым специальным синтаксисом, но внутренне определяется как строка. Затем строка анализируется в отдельной глобальной переменной при каждом изменении значения. Важно отметить, что результат разбора строки на целое число не сохраняется обратно в таблицу настроек, поэтому при вызове phpinfo()
вы видите исходный ввод, а не проанализированное значение.
Это видно в источнике:
Поддерживаемый синтаксис в конечном итоге определен в zend_atol
, который:
- анализирует строку для значения цифры 1010 *, игнорируя любой дополнительный текст
- просматривает последний символ строка, и умножает предыдущее значение, если оно равно
g
, G
, m
, M
, k
или K
Значение без цифр в начале будет проанализировано как ноль , При установке глобальной переменной это установит предел памяти на минимально допустимый, основанный на константе ZEND_MM_CHUNK_SIZE
.
. Вы можете увидеть эффект, установив предел памяти, а затем быстро выполнив al oop выделяет большой объем памяти и смотрит, что выходит в сообщении об ошибке. Например:
# 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