Tamanho de memória permitido de 33554432 bytes esgotados (tentou alocar 43148176 bytes) em php


279

Esta mensagem de erro está sendo apresentada, alguma sugestão?

Tamanho de memória permitido de 33554432 bytes esgotados (tentou alocar 43148176 bytes) em php


5
Aumente seu limite máximo de memória para 64 MB no seu arquivo php.ini. Pesquisa no Google Mas posso perguntar por que você está tentando alocar tanta memória? Em que linha de código ele falha?

1
O que o script está fazendo quando falha? você pode postar o código?
911 Neil Aitken

3
Parece um arquivo txt muito grande.
macbirdie

10
Convencionalmente, você lê arquivos de tamanho potencialmente grande ou arbitrário, uma linha por vez, substituindo a memória da linha anterior a cada linha lida. Ou talvez você queira apenas ajustar o cabeçalho ou o arquivo para obter as entradas mais recentes. Aumentar a alocação de memória à medida que o arquivo aumenta não é a resposta.
ekerner

Respostas:


317

Finalmente encontrei a resposta:

Basta adicionar esta linha abaixo à linha antes de você receber erro no seu arquivo

ini_set('memory_limit', '-1');

Vai demorar um uso ilimitado de memória do servidor, está funcionando bem.

Obrigado por dar sugestões aos amigos.


125
Você ainda deve verificar por que a memória está esgotada. Talvez você não precise ler o arquivo inteiro, talvez leia-o sequencialmente.
macbirdie

8
- @panidarapu e @Don Jones: Dependendo da quantidade de memória e de como esse script é usado, pode ser perigoso permitir a alteração no uso da memória dessa maneira. Não, no seu caso, você pode dividir o feed em pedaços menores e analisar o que precisa. Que bom que funciona, mas tenha cuidado.
covarde anônimo

5
Essa sugestão funcionou para mim. O aumento dinâmico do limite de memória no script é feito através da função ini_set (): ini_set ('memory_limit', '128M');
mente 12/02

37
Gente, por favor, não faça esta solução rápida. Pode machucá-lo a longo prazo. Como um bom programador, você deve descobrir a razão por trás desse consumo de memória e aumentar conforme necessário, em vez de mantê-lo UNLIMITED.
Sumoanand

113
Uau, essa resposta maciçamente votada parece uma prática muito ruim para mim. -1!
Ambidex

59

Aqui estão dois métodos simples para aumentar o limite de hospedagem compartilhada:

  1. Se você tiver acesso ao seu arquivo PHP.ini, altere a linha no PHP.ini. Se sua linha mostra 32M, tente 64M: memory_limit = 64M ; Maximum amount of memory a script may consume (64MB)

  2. Se você não tem acesso ao PHP.ini, tente adicionar isso a um arquivo .htaccess: php_value memory_limit 64M


47

Seu script está usando muita memória. Isso geralmente pode acontecer no PHP se você tiver um loop que ficou fora de controle e estiver criando objetos ou adicionando matrizes a cada passagem do loop.

Verifique se há loops infinitos.

Se esse não for o problema, tente ajudar o PHP destruindo objetos com os quais você terminou configurando-os como nulos. por exemplo.$OldVar = null;

Verifique o código onde o erro realmente acontece também. Você esperaria que essa linha alocasse uma quantidade enorme de memória? Caso contrário, tente descobrir o que deu errado ...


3
Eu tive esse problema exato - descobri que, inadvertidamente, criei uma função recursiva - e, portanto, ela ficou sem memória a qualquer momento aleatório durante a execução do código. Isso me deu a vantagem de agora ter o código mais eficiente em termos de memória do mundo, criado na busca por um vazamento de memória.
Kris Selbekk #

1
Pelo bem de outras pessoas que perseguem um coelho por um buraco. Doutrina no Symfony, acho que tem um problema com o monolog e, quando houver uma exceção do DOP, ele criará um loop infinito de exceções, pois tentará uma exceção para a exceção, ocultando o problema real (um arquivo db corrompido no meu caso).
Desislav Kamenov

39

Fazendo:

ini_set('memory_limit', '-1');

nunca é bom. Se você deseja ler um arquivo muito grande, é uma boa prática copiá-lo pouco a pouco. Tente o seguinte código para obter as melhores práticas.

$path = 'path_to_file_.txt';

$file = fopen($path, 'r');
$len = 1024; // 1MB is reasonable for me. You can choose anything though, but do not make it too big
$output = fread( $file, $len );

while (!feof($file)) {
    $output .= fread( $file, $len );
}

fclose($file);

echo 'Output is: ' . $output;

6
Não posso acreditar que todas essas pessoas recomendam definir memory_limit como -1 ... coisa louca para fazer em um servidor de produção. Obrigado por uma solução muito mais limpa.
JohnWolf

2
Enquanto estiver na "melhor prática", é bom fechar o manipulador de arquivos após o whileloop:fclose($file)
kodeart 9/09/15

2
@assetCorp Como isso ajuda, desde que o arquivo tenha, por exemplo, 100MiB e o limite de memória PHP ainda esteja definido como 32 MiB. Você o lê por partes seguras de 1MiB, mas depois o anexa a uma variável que utilizará toda a memória disponível quando o loop atingir 31. iteração. Como está melhor? Somente a saída dos pedaços da mesma forma para não exigir o armazenamento de todos em uma variável ajudaria a resolver o problema.
helvete

17

Infelizmente, é fácil programar em PHP de uma maneira que consome memória mais rapidamente do que você imagina. Copiar strings, matrizes e objetos em vez de usar referências fará isso, embora o PHP 5 deva fazer isso mais automaticamente do que no PHP 4. Mas lidar com o conjunto de dados completo em várias etapas também é um desperdício, se comparado ao processamento da menor unidade lógica de uma vez. O exemplo clássico está trabalhando com grandes conjuntos de resultados de um banco de dados: a maioria dos programadores busca todo o conjunto de resultados em uma matriz e, em seguida, faz um loop sobre ele uma ou mais vezes foreach(). É muito mais eficiente na memória usar um while()loop para buscar e processar uma linha por vez. O mesmo se aplica ao processamento de um arquivo.


Parece bastante provável que é isso que acontece.
Kzqai #

13

Se você quiser ler arquivos grandes, leia-os pouco a pouco em vez de lê-los imediatamente.
É simples: se você ler um arquivo grande de 1 MB ao mesmo tempo, será necessário pelo menos 1 MB de memória ao mesmo tempo para armazenar os dados.

Então você deve lê-los pouco a pouco usando fopen& fread.


1
Resolvido isso usando:$fh = fopen($folder.'/'.$filename, "rb") or die(); $buffer = 1024*1024; while (!feof($fh)) { print(fread($fh, $buffer)); flush(); } fclose($fh);
Kai Noack

12

Eu enfrentei o mesmo problema no php7.2 com o laravel 5.6. Eu apenas aumento a quantidade de variável memory_limit = 128Mno php.ini conforme meus aplicativos exigem. Pode ser 256M / 512M / 1048M ..... Agora funciona bem.


6

Eu também estava tendo o mesmo problema, procurei arquivos phpinfo.ini, php.ini ou .htaccess sem sucesso. Finalmente, olhei para alguns arquivos php, os abri e verifiquei os códigos dentro de memória. Finalmente, essa solução foi a que eu criei e funcionou para mim. Eu estava usando o wordpress, então esta solução pode funcionar apenas para o problema de limite de tamanho de memória do wordpress. Minha solução, abra o arquivo default-constants.php na pasta / public_html / wp-includes . Abra esse arquivo com o editor de código e encontre as configurações de memória no wp_initial_constantsescopo, ou apenas pressione Ctrl + F para encontrar a palavra "memória". Lá você virá WP_MEMORY_LIMITe WP_MAX_MEMORY_LIMIT. Apenas aumente, foram 64 MB no meu caso, eu aumentei para 128 MB e depois para 200 MB.

// Define memory limits.
if ( ! defined( 'WP_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MEMORY_LIMIT', $current_limit );
    } elseif ( is_multisite() ) {
        define( 'WP_MEMORY_LIMIT', '200M' );
    } else {
        define( 'WP_MEMORY_LIMIT', '128M' );
    }
}

if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) {
    if ( false === wp_is_ini_value_changeable( 'memory_limit' ) ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } elseif ( -1 === $current_limit_int || $current_limit_int > 268435456 /* = 256M */ ) {
        define( 'WP_MAX_MEMORY_LIMIT', $current_limit );
    } else {
        define( 'WP_MAX_MEMORY_LIMIT', '256M' );
    }
}

Aliás, não faça o seguinte código, porque isso é uma prática ruim:

ini_set('memory_limit', '-1');

1
Funciona para sites wordpress, onde o acesso não está disponível para arquivos .htaccess e php.ini. +1
Mustafa sabir

Eu diria que alterar esses limites em um arquivo WordPress 'principal' não é realmente uma boa ideia; você pode adicionar esses limites com muita facilidade wp-config.php, onde eles não serão substituídos por futuras atualizações do WordPress. Além disso, alguns plugins de segurança (como o WordFence, por exemplo) irão reclamar se os arquivos do WordPress 'principais' forem alterados ...
Gwyneth Llewelyn em

1
@GwynethLlewelyn Não sei como fazer isso, você pode elaborar, por favor?
garakchy 6/01

1
Ah ... basta editar wp-config.phpe adicionar as duas linhas lá ( ou seja, define( 'WP_MEMORY_LIMIT', '200M' );e define( 'WP_MAX_MEMORY_LIMIT', '256M' );. Diferentemente dos arquivos no WP 'principal' (ou seja, tudo abaixo wp-includes), que serão substituídos pelas atualizações do WP, wp-config.phpnão - ele está exatamente para o objetivo exato de substituir as constantes WP!
Gwyneth Llewelyn

1
"má prática" é situacional. -1é bom para processos de execução curta. Por exemplo, um container php builder usado para executar testes de unidade ou instalações do compositor / etc. Só não gere seu site de produção com esse conjunto definido.
emmdee 28/01

5

Você pode aumentar a memória permitida para o script php executando a seguinte linha acima de todos os códigos no script:

ini_set('memory_limit','-1'); // enabled the full memory available.

E também aloque as variáveis ​​indesejadas no script.

Confira esta biblioteca php: Liberando memória com PHP



3

Percebo que muitas respostas apenas tentam aumentar a quantidade de memória dada a um script que tem seu lugar, mas na maioria das vezes isso significa que algo está sendo muito liberal com a memória devido a uma quantidade imprevista de volume ou tamanho. Obviamente, se você não é o autor de um script, está à mercê do autor, a menos que se sinta ambicioso :) Os documentos do PHP dizem mesmo que problemas de memória são devidos a " scripts mal escritos "

Deve-se mencionar que ini_set('memory_limit', '-1');(sem limite) pode causar instabilidade no servidor como 0 bytes free = bad things. Em vez disso, encontre um equilíbrio razoável entre o que seu script está tentando fazer e a quantidade de memória disponível em uma máquina.

Uma abordagem melhor: se você é o autor do script (ou ambicioso), pode depurar esses problemas de memória com o xdebug . A versão mais recente (2.6.0 - lançada em 2018-01-29) trouxe de volta o perfil de memória que mostra quais chamadas de função estão consumindo grandes quantidades de memória. Ele expõe problemas no script que são difíceis de encontrar. Geralmente, as ineficiências estão em um loop que não está esperando o volume que está recebendo, mas cada caso será deixado como um exercício para o leitor :)

A documentação do xdebug é útil, mas se resume a três etapas:

  1. Instale - Disponível através do apt-gete yumetc
  2. Configurá-lo - xdebug.ini: xdebug.profiler_enable = 1,xdebug.profiler_output_dir = /where/ever/
  3. Veja os perfis em uma ferramenta como QCacheGrind , KCacheGrind

2

Se você estiver tentando ler um arquivo, isso ocupará memória em PHP. Por exemplo, se você estiver tentando abrir e ler um arquivo MP3 (como, por exemplo, $ data = file (" http://mydomain.com/path/sample.mp3 ")), ele armazenará tudo na memória .

Como Nelson sugere, você pode trabalhar para aumentar seu limite máximo de memória se realmente precisar usar tanta quantidade de memória.


2

Tivemos uma situação semelhante e testamos as respostas no topo das respostas ini_set ('memory_limit', '-1'); e tudo funcionou bem, arquivos de imagens compactadas maiores que 1 MB em KBs.


1

Escrever

ini_set('memory_limit', '-1');

no seu index.php na parte superior após a abertura da tag php


1

Eu estava recebendo a mesma mensagem de erro depois de mudar para um novo tema no Wordpress. O PHP estava executando a versão 5.3, então mudei para 7.2. Isso corrigiu o problema.


1

Se você estiver usando uma hospedagem compartilhada, não poderá aplicar o incremento no limite de tamanho do php.

Basta ir ao seu cpanel e atualizar sua versão php para 7.1 e acima, então você está pronto para começar.


0

usuários wordpress adicionar linha:

@ini_set('memory_limit', '-1');

em wp-settings.php, que você pode encontrar na pasta raiz instalada do wordpress


0

Eu não havia renovado minha hospedagem e o banco de dados era somente leitura. O Joomla precisava escrever a sessão e não conseguiu.


0

Eu tive o mesmo problema que executando php na linha de comando. Recentemente, alterei o arquivo php.ini e cometi um erro ao alterar o php.ini

Isto é para php7.0

caminho para o php.ini onde cometi um erro: /etc/php/7.0/cli/php.ini

Eu havia definido memory_limit = 256(o que significa 256 bytes) em
vez de memory_limit = 256M(o que significa 256 Mega bytes).

; Quantidade máxima de memória que um script pode consumir (128 MB)
; http://php.net/memory-limit
memory_limit = 128M

Depois de corrigi-lo, meu processo começou a funcionar bem.



-1

se você estiver usando laravel, use estas maneiras

public function getClientsListApi(Request $request){ print_r($request->all()); //for all request print_r($request->name); //for all name }

ao invés de

public function getClientsListApi(Request $request){ print_r($request); // it show error as above mention }

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.