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

panidarapu
fonte
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.

panidarapu
fonte
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

Haider Abbas
fonte
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 ...

Rik Heywood
fonte
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;
Delali
fonte
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.

staticsan
fonte
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.

quiabo
fonte
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.

Ziaur Rahman
fonte
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');
garakchy
fonte
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

Sanjay Kumar NS
fonte
4
ini_set('memory_limit', '-1');
Nnh Nguyễn Thế
fonte
3
@Pang ini_set ('memory_limit', '-1');
DIGITALCRIMINAL
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
SeanDowney
fonte
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.

Beau Simensen
fonte
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.

dynamicflow
fonte
1

Escrever

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

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

Prafull
fonte
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.

DavGarcia
fonte
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.

successtar
fonte
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

Praveesh P
fonte
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.

Alberto M
fonte
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.

theBuzzyCoder
fonte
0

Execute este comando no diretório raiz do Magento php -d memory_limit=4G bin/magento

Mohammed Muzammil
fonte
-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 }

Ajay
fonte