Ticket #1026 (closed melhoria: fixed)
Liberar a sessão em requisições iniciais do expressoMail
Reported by: | amuller | Owned by: | amuller |
---|---|---|---|
Priority: | média | Milestone: | Expresso 2.2 |
Component: | ExpressoMail | Version: | trunk |
Severity: | Keywords: | requisições paralelo ajax | |
Cc: | WorkGroup: |
Description
Liberar a sessão antes das operações do IMAP na inicialização do expressoMail para possibilitar que as requisições sejam executadas em paralelo.
Para cada requisição basta fechar a sessão assim que ela não seja mais usada. Isto deixará a inicialização mais rápida.
Change History
comment:4 Changed 14 years ago by niltonneto
Testei aqui, e de fato, fica muito mais rápido. Mas será que não seria mais elegante centralizar "session_write_close();" no final do Controller? Ou não é possível? Assim poderíamos livrar as classes e seus métodos desta responsabilidade.
comment:5 Changed 14 years ago by amuller
Não dá. Porque tem que ser no COMEÇO. E se for no começo do controller você fecha a sessão e não sabe que informações vai precisar no decorrer da execução.
Do jeito que está agora eu acredito que vai resolver alguns poucos problemas de concorrência de requisições como salvar e enviar que são um problema recorrente. Infelizmente para requisições cExecuteForm a sessão é usada para retornar um valor impossibilitando liberá-la.
um bom teste é
1 - colocar sleep(5) no function open_mbox do class.imap_functions (e abrir o expressoMail) 2 - fazer: svn up -r2400 expressoMail1_2 3 - colocar sleep(5) no function open_mbox do class.imap_functions (e abrir o expressoMail)
A diferença fica de 6 segundos pra quase 30. Veja que este sleep poderia ser a resolução de um nome num DNS lento por exemplo.
O problema é que a sessão é um recurso muito requisitado, e ao mesmo tempo muito limitado pois só 1 por vez pode tê-la.
comment:6 follow-up: ↓ 7 Changed 14 years ago by amuller
Nilton: o que poderia ser feito: Ver todos os elementos do _SESSION que a class._imap_functions usa (não são muitos, variam sempre entre uns 10). No construtor da classe colocar num atributo, e liberar a sessão. Dessa forma todas as requisições de class.imap_functions seriam concorrentes. Já seria mais coeso. Se Você der ACK poderia ser feito.
comment:7 in reply to: ↑ 6 Changed 14 years ago by niltonneto
Replying to amuller:
Nilton: o que poderia ser feito: Ver todos os elementos do _SESSION que a class._imap_functions usa (não são muitos, variam sempre entre uns 10). No construtor da classe colocar num atributo, e liberar a sessão. Dessa forma todas as requisições de class.imap_functions seriam concorrentes. Já seria mais coeso. Se Você der ACK poderia ser feito.
Entendi. Poderíamos padronizar isso em todas as classes que usam variáveis em $_SESSION, como por exemplo, criar um método "loadSessionVars" para encapsular essa manipulação de variáveis e liberar a sessão. Seria invocá-la dentro do construtor de cada classe e pronto.
comment:8 follow-up: ↓ 11 Changed 14 years ago by amuller
loadSessionVars acho que não dá pra fazer. Pois cada classe vai usar coisas diferentes, daí seria como tirar uma cópia do session
comment:10 Changed 14 years ago by amuller
r2481 falta de atenção.
comment:11 in reply to: ↑ 8 Changed 14 years ago by niltonneto
Replying to amuller:
loadSessionVars acho que não dá pra fazer. Pois cada classe vai usar coisas diferentes, daí seria como tirar uma cópia do session
Sim, eu sei que cada classe vai usar variáveis distintas na $_SESSION. A ideia seria apenas para facilitar a vida do programador e deixar mais organizado. Encapsular o código feito no seu commit (r2480), que está tudo jogado do construtor, em um método de nome padrão. Para as demais classes, idem. Mas você que sabe.
comment:12 Changed 14 years ago by amuller
r2484 joga pra método da classe o load session var
comment:13 Changed 14 years ago by amuller
r2493 corrige uns problemas relacionados a preferencias e ao phpmailer
r2416 implementa a mudança. O resultado é interessante quando o imap tem alta latência.