Ticket #535 (new defeito)
Fatal error: Allowed memory size exhausted
Reported by: | niltonneto | Owned by: | alguem |
---|---|---|---|
Priority: | média | Milestone: | Backlog do Produto |
Component: | ExpressoMail | Version: | |
Severity: | média | Keywords: | exhausted allowed memory allocated |
Cc: | WorkGroup: |
Description
Esse problema acontece há anos, porém nunca foi discutido mais a fundo. O problema ocorre independente do limite de memória liberada no "php.ini". O administrador pode configurar 64Mb ou 1024Mb, mas dependendo da utilização do WebServer? isso não será suficiente para que a classe "class.smtp.inc.php" consiga enviar um email com um anexo pequeno. Portanto, o aumento de memória no "php.ini" pode até diminuir os erros, mas não soluciona efetivamente.
Fiz então uma rápida pesquisa à respeito, e descobri que o erro "Allowed memory size of <memorialiberada> bytes exhausted (tried to allocate X bytes)" é muito comum para aqueles que utilizam o PHP para processar o envio de emails através de um servidor SMTP. Outras ferramentas livres (pesquisei também) como HORDE e ROUNDCUBE têm o mesmo problema. Um desses usa o PEAR-PHP como MAIL API, e adivinhem, também possui esse bug registrado , e não encontrei nenhuma solução.
O erro em nosso Expresso acontece comumente na linha 309, como esse:
Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 77 bytes) in /var/www/expresso/expressoMail1_2/inc/class.smtp.php on line 309
Possível solução: Pelo que percebi nos fóruns, o único jeito de tentar resolver o problema é rever como o método Data() implementa a RFC822. Espero que alguém mais se preocupe com isso, para que possamos pensar coletivamente na solução.
Attachments
Change History
comment:2 Changed 14 years ago by rodsouza
O problema não está exclusivamente relacionado com a classe SMTP.
O conjunto dos arquivos e a linha de execução gera o acúmulo de memória de forma indevida.
A simples inclusão do arquivo 'class.imap_function.inc.php' consome 1493368 bytes, ou seja, 1.4 Mb.
Esse consumo é verificado só com a inclusão do arquivo sem ao menos instânciar a classe.
A instância da classe já não é fator relevante pois no momento da criação do objeto o consumo de memória passa a ser de 1494396 bytes, ou seja, 1028 bytes.
Para constar, se a configuração do PHP de limitação de memória for 15 Mb então apenas na inclusão do arquivo 'class.imap_function.inc.php' já é consumido 10% do total hábil para uso.
Ao passo que se a operação a ser ralizada pelo objeto for a de enviar e-mail - 'send_mail' - o consumo de memória após ser realizada a inclusão dos arquivos 'class.phpmailer.php' e 'class.db_functions.inc.php' é de 6432924 bytes, ou seja, 6.13 Mb.
Quando se pondera o uso de memória sobre o permitido - ainda utilizando como referência 15 Mb - então será observado que nesse momento o consumo já é de 40%.
Esse consumo de memória ocorreu apenas com a inclusão dos arquivos. Observa-se que esse consumo fica estável até o momento em que é realizado a codificação do corpo da mensagem.
comment:3 Changed 14 years ago by wmerlotto
- Milestone set to Expresso 2.0
Então, nenhuma alteração será realizada no Expresso? Podemos fechar o ticket?
comment:4 Changed 14 years ago by niltonneto
- Milestone changed from Expresso 2.0 to Expresso 2.1
Nesse momento, acho melhorar realocar pra próxima versão.
comment:5 Changed 13 years ago by wmerlotto
- Milestone changed from Expresso 2.1 to Expresso 2.2
Novamente, para a próxima versão...
comment:6 Changed 13 years ago by niltonneto
Será que se usarmos a função nativa php "imap_gc" não resolve? No link " http://br2.php.net/manual/en/function.imap-gc.php" tão falando que se as funções imap estiverem "comendo" muita memória, dá pra liberar memória manualmente com esse GC PHP nativo. Acho interessante testarmos isso.
comment:7 Changed 13 years ago by amuller
[2295] faz algumas modificações que permitem um pouco mais de folga. Ou seja não resolve o problema, mas melhora um pouco. Nos testes realizados, não houveram problemas, mas tem que testar mais.
Changed 13 years ago by amuller
-
attachment
class.phpmailer.php
added
Classe php mailer sem cópia do body
comment:8 Changed 13 years ago by amuller
r2316 corrige alguns probleminhas do commit anterior. Foi anexado a este ticket uma implementação do class.smtp e class.phpmailer sem utilizar os implodes e explodes do smtp->data e passando o corpo por referência. Essa implementação ficou absurdamente lenta com anexos grande e por isso não foi commitada.