Introdução: por que seu script PHP «explode»?
\n\nVocê 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\nO 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\nO artigo foi escrito para o site educacional PythonLib, mas todo o código e exemplos são em PHP. Vamos lá!
\n\nO que é memory_limit e de onde vem o «134217728»?
\n\nNo 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).
Você pode verificar o limite atual assim:
\n\n<?php\necho ini_get('memory_limit'); // Exibirá, por exemplo, "128M"\n?>\n\nQuando 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\nCená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
Como corrigir o erro: 3 métodos comprovados
\n\n1. Aumento temporário do limite com ini_set()
\n\nA 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\nImportante: isso só funciona se sua hospedagem permitir a sobrescrita da diretiva. Em algumas hospedagens, o ini_set() para memory_limit é bloqueado.
\n\n2. Alteração do php.ini ou .htaccess
\n\nSe você tiver acesso ao servidor, edite o php.ini:
memory_limit = 256M\n\nOu via .htaccess (no Apache):
php_value memory_limit 256M\n\nApós as alterações, reinicie o servidor web ou o PHP-FPM.
\n\n3. Otimização do código — a melhor solução
\n\nAumentar o limite é uma gambiarra. A verdadeira solução é escrever um código eficiente. Vamos analisar exemplos.
\n\nExemplo real: processamento de um grande arquivo CSV
\n\nSuponha 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\nCom um arquivo de 200 MB — o script falhará com erro de memória.
\n\nOtimizaçã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\nAgora o script usa apenas alguns megabytes, independentemente do tamanho do arquivo.
\n\n<