Executando o PHP Versão 7.1.30 no RHEL 7.7.
Estou querendo aumentar o memory_limit, mas não tinha certeza se tinha a sintaxe correta (ou seja, 256M ou 256MB). Então, para começar, coloquei um valor ruim "Hugo" como a configuração memory_limit. O problema com isso é o resultado de phpinfo () (executado em httpd) literalmente ter a string "Hugo" no lugar, ou seja:
Portanto, isso me preocupa um pouco que o PHP não faça nenhuma verificação de sanidade para o (s) valor (es). (Se o valor fornecido for ruim, esperaria que ele retornasse ao padrão, por exemplo)
Alguém pode comentar sobre isso - em particular, como você sabe se o PHP aplicará as coisas (se uma string arbitrária puder ser fornecida).
(int) 'HUGO'; // => 0
. O que começa a falhar na minha máquina com 2 MB de memória usada.memory_limit 256M
.Respostas:
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:
zend_atol
, que lida com os sufixos especiaisA sintaxe suportada é finalmente definida em
zend_atol
, que: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:
fonte
Primeiro, precisamos entender como o PHP.ini funciona no caminho do fluxo de trabalho de interpretação. memory_limit é diretivas para PHP.
ao usar com a função PHP, você deve fazer algo assim
ini_set(‘memory_limit’,’256MB’)
. Portanto, essa função definirá temporariamente seu valor para a variável intérprete. Se você vir mais de perto, poderá obter as duas colunas Uma é para o Local e Uma é para o global. Isso mostra a capacidade dos valores para o indivíduo, respectivamente.Porém, quando você definiu para global, precisa definir como sufixo K, M, G, respectivamente. Se excedermos esse valor usando o apache .htaccess, será necessário o mesmo para o PHP fpm.
fonte