Смущает то, что настройка выглядит как целое число с некоторым специальным синтаксисом, но внутренне определяется как строка. Затем строка анализируется в отдельной глобальной переменной при каждом изменении значения. Важно отметить, что результат разбора строки на целое число не сохраняется обратно в таблицу настроек, поэтому при вызове 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