Se o real_usage
argumento for definido como true
PHP DOCS, diga que ele obterá o tamanho real da memória alocada do sistema. Se for false
, irá obter a memória informada poremalloc()
Qual dessas 2 opções retorna o máximo. memória alocada em relação ao valor limite de memória no php.ini?
Quero saber o quão perto esteve o script de atingir esse limite.
php
memory
memory-management
Thelolcat
fonte
fonte
Respostas:
Ok, vamos testar isso usando um script simples:
Resultado:
Parece que o uso real é a memória alocada do sistema - que parece ser alocada em depósitos maiores do que o atualmente necessário para o script. (Acho que por motivos de desempenho). Esta também é a memória que o processo php usa.
O
$real_usage = false
uso é o uso de memória que você realmente usou em seu script, não a quantidade real de memória alocada pelo gerenciador de memória do Zend.Leia esta pergunta para mais informações.
Resumindo: para saber o quão perto você está do limite de memória, use
$real_usage = true
fonte
if (segment_size < true_size || heap->real_size + segment_size > heap->limit) { /* Memory limit overflow */
.emalloc
(mais bytes para cabeçalhos e alinhamento de memória). Não reflete o desperdício de memória devido a blocos não cabendo no espaço restante em segmentos já alocados. Se você alterar seu exemplo para alocar (1024 * 256) bytes e um limite de 2M, a diferença de dois se tornará mais aparente.memory_get_usage(true)
valor de retorno que deve ser comparadomemory_limit
. O exemplo dado na resposta é muito simples, pois não há "memória desperdiçada". O que acontece é que a memória alocada "real" precisa ser aumentada de "1 MiB" para "1,25 MiB" e é isso que aciona o erro fatal . Eu tenho um script de lote complexo com limite de memória de 120 MiB que tem memória alocada "não real" de apenas "80 MiB" quando é cancelado porque a memória alocada "real" atinge o limite.Introdução
Você deve usar
memory_get_usage(false)
porque o que você quer é a memória usada, não a memória alocada.Qual é a diferença
Você
Google Mail
pode ter alocado25MB
espaço de armazenamento para você, mas isso não significa que é o que você está usando no momento.Isso é exatamente o que o documento PHP estava dizendo
Ambos os argumentos retornariam memória alocada em relação ao limite de memória, mas a principal diferença é:
memory_get_usage(false)
fornece a memória usada poremalloc()
whilememory_get_usage(true)
retorna o marco que pode ser demonstrado aqui Memory Mile StoreQuero saber o quão perto esteve o script de atingir esse limite.
Isso exigiria alguma matemática e só funcionaria em loops ou casos de uso específicos. Por que eu disse isso?
Imagine
The above script would fail before you even get the chance to start start checking memory
.Pelo que eu sei, a única maneira de verificar a memória usada para uma variável ou seção específica do PHP é:
Consulte a Explicação , mas se você estiver em um loop ou em uma função recursiva, poderá usar o uso máximo de memória para estimar com segurança quando o pico de memória será alcançado.
Exemplo
Resultado
Demonstração ao vivo
Isso ainda pode falhar
Pode falhar porque depois
if ($percentage > $peekPoint) {
disso ainda adicionar tarefas adicionais com também consome memóriaIf the memory to process this request is grater than the memory available the script would fail.
Conclusão
Não é uma solução perfeita, mas verifique se há memória no intervalo e se ela exceder peek (por exemplo, 90%)
exit
instantaneamente e deixe as coisas sofisticadasfonte
memory_limit
opção é sobre pilha? ou pilha?real_usage
false reporta o uso que seu script usou . Este será o mais preciso dos dois.real_usage
true relata a memória alocada para seu script. Este será o mais alto dos dois.Eu provavelmente usaria
true
se estivesse tentando comparar, já que seu script nunca seria alocado além do limite de memória e continuaria a ser executado enquanto (mais todos os outros scripts) não exceder esse uso.fonte
false
é a memória que o script usou ,true
é a memória alocada .conforme PHP memory_get_usage
então, para obter a memória usada pelo seu script, você deve usar memory_get_usage () já que real_usage é false.
se você deseja obter a memória alocada pelo sistema, mas não se importa com a quantidade realmente usada, use memory_get_usage (true);
fonte
fonte