A coisa confusa aqui é que a configuração se parece com um número inteiro com alguma sintaxe especial, mas é definida internamente como uma string. A sequência é analisada em uma variável global separada sempre que o valor é alterado. Fundamentalmente, o resultado da análise da string em um número inteiro não é salvo de volta na tabela de configurações; portanto, quando você chama phpinfo()
, vê a entrada original, não o valor analisado.
Você pode ver isso na fonte:
A sintaxe suportada é finalmente definida em zend_atol
, que:
- analisa a sequência para um valor numérico, ignorando qualquer texto adicional
- olha para o último caractere da string, e multiplica o valor anterior se é
g
, G
, m
, M
, k
, ouK
Um valor sem dígitos no início será analisado como zero. Ao definir a variável global, isso definirá o limite de memória para o mínimo permitido, com base na constante ZEND_MM_CHUNK_SIZE
.
Você pode ver o efeito definindo o limite de memória e executando um loop que aloca rapidamente uma grande quantidade de memória e vendo o que sai na mensagem de erro. Por exemplo:
# 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