Ticket #1026 (closed melhoria: fixed)

Opened 12 years ago

Last modified 12 years ago

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:1 Changed 12 years ago by amuller

  • Status changed from new to closed
  • Resolution set to fixed

r2416 implementa a mudança. O resultado é interessante quando o imap tem alta latência.

comment:2 Changed 12 years ago by amuller

r2426 melhora ainda o get_folders_list

comment:3 Changed 12 years ago by amuller

Errata: r2427 melhora ainda o get_folders_list

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

comment:10 Changed 12 years ago by amuller

r2481 falta de atenção.

comment:11 in reply to: ↑ 8 Changed 12 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 12 years ago by amuller

r2484 joga pra método da classe o load session var

comment:13 Changed 12 years ago by amuller

r2493 corrige uns problemas relacionados a preferencias e ao phpmailer

Note: See TracTickets for help on using tickets.