PHP Fatal Error: Allowed Memory Size — desmistificando e configurando

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que seu script PHP «explode»?

\n\n

Você já viu uma tela branca com a mensagem arrepiante «Fatal Error: Allowed Memory Size of 134217728 Bytes Exhausted»? Se sim — você não está sozinho. Esta pergunta no Stack Overflow acumulou milhares de visualizações, e praticamente todo desenvolvedor PHP já se deparou com ela pelo menos uma vez na vida.

\n\n

O número 134217728 bytes equivale exatamente a 128 megabytes (o limite padrão para muitas hospedagens). Quando seu script tenta usar mais — o PHP diz «pare» e lança um erro fatal. Mas não entre em pânico! Neste artigo, vamos entender por que isso acontece, como corrigir e — o mais importante — como otimizar o desempenho para que o erro de memória não o incomode mais.

\n\n

O artigo foi escrito para o site educacional PythonLib, mas todo o código e exemplos são em PHP. Vamos lá!

\n\n

O que é memory_limit e de onde vem o «134217728»?

\n\n

No PHP, existe a diretiva memory_limit, que define a quantidade máxima de memória disponível para um único script. Por padrão, em muitas configurações (especialmente em hospedagens compartilhadas), o valor é 128M (ou 134217728 bytes).

\n\n

Você pode verificar o limite atual assim:

\n\n
<?php\necho ini_get('memory_limit'); // Exibirá, por exemplo, "128M"\n?>
\n\n

Quando seu script ultrapassa esse limite — o PHP encerra imediatamente a execução com um erro fatal. As causas podem variar: desde código ineficiente até o carregamento de arquivos enormes na memória.

\n\n

Cenários típicos que causam o erro

\n\n
    \n
  • Trabalho com grandes arrays — por exemplo, ler um arquivo CSV inteiro na memória.
  • \n
  • Loops com vazamentos — você esqueceu de liberar variáveis ou está usando arrays globais.
  • \n
  • Bibliotecas de processamento de imagens — GD ou Imagick ao trabalhar com fotos de alta resolução.
  • \n
  • Funções recursivas — sem uma condição de base, entram em loop infinito e consomem a pilha.
  • \n
  • ORM e cache — alguns ORMs (como Doctrine) podem carregar toda a tabela na memória.
  • \n
\n\n

Como corrigir o erro: 3 métodos comprovados

\n\n

1. Aumento temporário do limite com ini_set()

\n\n

A maneira mais rápida é aumentar o limite diretamente no script:

\n\n
<?php\nini_set('memory_limit', '256M');\n// Agora o script pode usar até 256 MB\n?>
\n\n

Importante: isso só funciona se sua hospedagem permitir a sobrescrita da diretiva. Em algumas hospedagens, o ini_set() para memory_limit é bloqueado.

\n\n

2. Alteração do php.ini ou .htaccess

\n\n

Se você tiver acesso ao servidor, edite o php.ini:

\n\n
memory_limit = 256M
\n\n

Ou via .htaccess (no Apache):

\n\n
php_value memory_limit 256M
\n\n

Após as alterações, reinicie o servidor web ou o PHP-FPM.

\n\n

3. Otimização do código — a melhor solução

\n\n

Aumentar o limite é uma gambiarra. A verdadeira solução é escrever um código eficiente. Vamos analisar exemplos.

\n\n

Exemplo real: processamento de um grande arquivo CSV

\n\n

Suponha que você tenha um arquivo CSV com 500.000 linhas. Um código ingênuo pode ser assim:

\n\n
<?php\n$rows = file('data.csv'); // Carrega o arquivo INTEIRO na memória!\nforeach ($rows as $row) {\n    // processamento\n}\n?>
\n\n

Com um arquivo de 200 MB — o script falhará com erro de memória.

\n\n

Otimização: leitura linha por linha

\n\n
<?php\n$handle = fopen('data.csv', 'r');\nif ($handle) {\n    while (($row = fgetcsv($handle)) !== false) {\n        // processa uma linha de cada vez\n        // a memória quase não aumenta\n    }\n    fclose($handle);\n}\n?>
\n\n

Agora o script usa apenas alguns megabytes, independentemente do tamanho do arquivo.

\n\n<

Blogs

Book Recommendations