Ticket #535 (new defeito)

Opened 10 years ago

Last modified 8 years ago

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

class.smtp.php Download (32.9 KB) - added by amuller 9 years ago.
Classe smtp sem explode e implodes
class.phpmailer.php Download (55.1 KB) - added by amuller 9 years ago.
Classe php mailer sem cópia do body

Change History

comment:1 Changed 10 years ago by niltonneto

  • Component changed from API to ExpressoMail

comment:2 Changed 10 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 10 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 10 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 10 years ago by wmerlotto

  • Milestone changed from Expresso 2.1 to Expresso 2.2

Novamente, para a próxima versão...

comment:6 Changed 10 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 9 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 9 years ago by amuller

Classe smtp sem explode e implodes

Changed 9 years ago by amuller

Classe php mailer sem cópia do body

comment:8 Changed 9 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.

comment:9 Changed 9 years ago by niltonneto

  • Milestone changed from Expresso 2.2 to Expresso 3.0

Segundo Rodrigo, os problemas aqui reportados têm grandes chances de serem solucionados usando o PHP 5.3. Vamos ver isso melhor no Expresso 3.0

comment:10 Changed 8 years ago by niltonneto

  • Version trunk deleted
  • Severity set to média
Note: See TracTickets for help on using tickets.