Ticket #622 (closed melhoria: fixed)

Opened 11 years ago

Last modified 10 years ago

Diminuir o tamanho da variável $_SESSION

Reported by: amuller Owned by: amuller
Priority: média Milestone: Expresso 2.2
Component: API Version: trunk
Severity: média Keywords: session php memoria
Cc: WorkGroup:

Description

A variável SESSION do PHP inciada automaticamente em cada requisição tem um tamanho médio de 250 kB por usuário. Entre as informações que a compõem existe:

  • Todos os Langs de todo os módulos
  • Preferência de todos os módulos
  • Senhas (inclusive do administrador do LDAP !?)
  • Pedaços de códigos, (consultas sql, códigos html não usados)
  • Redundância de informações

A diminuição do tamanho desta pode significar principalmente redução da quantidade de memória usada no servidor (da ordem de alguns GB). E eventualmente menor tempo de carregamento e descarregamento dela mesma, deixando requisições mais rápidas. A redundância pode não ser só exclusiva de cada sessão (duas chaves iguais), mas ser representativa em todas as sessões (é o caso do LANG, é igual pra todas as sessões).

O seqüestro de uma sessão pode ser feita por qualquer procedimento de Download na pasta onde ela está gravada, ou explorar códigos com injeção de código ou até mesmo códigos não usados. Significando que o usuário pode inclusive obter senha de administrador do LDAP. Com mais esfoço a manipulação dela pode ser pior ainda.

A resolução deste ticket seria desejável com resultados comprovados na diminuição do tamanho. Utilizando memory_get_usage() do php por exemplo.

Change History

comment:1 Changed 11 years ago by niltonneto

Podemos priorizar isso após a homologação da versão 2.0.

comment:2 Changed 11 years ago by wmerlotto

  • Milestone set to Expresso 2.1

Então já vamos deixar para o próximo milestone...

comment:3 Changed 11 years ago by amuller

  • Owner changed from alguem to amuller

comment:4 Changed 11 years ago by amuller

  • Status changed from new to assigned

comment:5 follow-up: ↓ 6 Changed 11 years ago by amuller

Essa questão precisa ser discutida: Ok! Os langs são redundantes, pois são iguais em todas as sessões. Mas lê-los daonde senão da sessão? do banco? de arquivo?

As preferências, ao carregar um módulo apagar todas as preferências de outros módulos?

E mais, como saber o que é usado e o que não é mais usado na sessão? :P

comment:6 in reply to: ↑ 5 Changed 11 years ago by niltonneto

Replying to amuller:

Essa questão precisa ser discutida: Ok! Os langs são redundantes, pois são iguais em todas as sessões. Mas lê-los daonde senão da sessão? do banco? de arquivo?

O E-GroupWare? carrega o array $_GLOBALS com os langs a partir do banco de dados, ou seja, para cada requisição de cada usuário, ele vai lá e popula o $GLOBALS novamente. Muito acesso desnecessário ao banco de dados. No ExpressoMail? foi feito diferente, na tentativa de diminuir esse acesso, optou-se em gravar na sessão do usuário esse array de langs, e somente na primeira vez que o usuário entra no módulo ele lê o arquivo de lang diretamente, e não no banco. Por outro lado, desse jeito o array $_SESSION acabou ficando grande, já que para cada usuário, ele tem as langs salvas na sua sessão.
Infelizmente, posso reconhecer que essa última não seja a melhor maneira de carregar as langs, mas que com certeza é bem melhor do que fazer do jeito que a API do EGroupWare faz. Imagina a dor de cabeça para ser fazer isso nas requisições AJAX. Ia ter que carregar o header.inc.php no controller.php, e isso seria terrível, em se tratando de overhead gerado (apache X postgresql) além do aumento no tempo de resposta significativo dessas requisições.
O que fazemos então? Sinceramente não tenho nenhuma idéia nesse momento.

As preferências, ao carregar um módulo apagar todas as preferências de outros módulos?

Acho que isso também é complicado, já que o módulo carregado pode precisar de alguma preferência de outro módulo não carregado (ex. JMessenger, Mobile, Calendar,etc..) para que seja efetuada alguma operação. Não sabemos a extensão disso, teria que testar melhor.

E mais, como saber o que é usado e o que não é mais usado na sessão? :P

Ahhh, pois é. Isso também é outra história. O correto é salvar na sessão apenas o estritamente necessário. Vejo códigos onde o array $_GLOBALSphpgwinfo?user? ou server? é salvo inteiro na sessão, quando o correto é salvar apenas as informações necessárias. Solução? Não sei... Talvez uma operação Pentefino no código que usa a variável $_SESSION, e analisando cada caso :-(

comment:7 Changed 11 years ago by amuller

Poderia ler o lang do arquivo (ela tem 400 linhas só), e colocar o arquivo em algum lugar fora do disco. Mas daí é um xunxo desgraçado, e totalmente tosco porque depende da configuração. Tenque pesar bem custo e benefício.

E ainda assim esse pensamento vira um ciclo! ler do arquivo é melhor que da sessão, e ler do sessão é melhor que do banco, ler do banco é melhor que do arquivo!

comment:8 Changed 11 years ago by wmerlotto

Seria uma boa analisar outras aplicações web, tipo Drupal...

comment:9 Changed 11 years ago by rodsouza

Utilizar XML para internacionalização.

Changeset [1503].

comment:10 Changed 11 years ago by amuller

r1507 complementa o commit anterior

comment:11 Changed 11 years ago by niltonneto

Fiquei curioso em saber números dessa melhoria. Alguém mensurou o antes/depois (tempo de resposta, tamanho da sessão, etc)?

comment:12 Changed 11 years ago by rodsouza

Não fiz isso mas não estou gostando da resposta. Estou com uma sensação que o navegador está sofrendo.

comment:13 Changed 11 years ago by amuller

A _SESSION diminuiu muito, pra mais da metade!

porém teve o lado que pesou no navegador porcausa do xml, daria pra fazer da forma que estava sendo feita antes. Só tirar da sessão e jogar direto do arquivo pro js.

Depois eu pretendo testar relatar as 3 soluções pra ver qual fica melhor.

comment:14 Changed 11 years ago by rodsouza

A questão da internacionalização é tratada no ticket #367

comment:15 follow-up: ↓ 16 Changed 11 years ago by amuller

r1526 remove a implementação de lang com xml/xsl por:

  • Estar com pt-br hardcoded
  • Não ter relação alguma com este ticket
  • Ficar totalmente fora do padrão dos outros módulos e deixar mais lento sem necessidade

comment:16 in reply to: ↑ 15 Changed 11 years ago by wmerlotto

Replying to amuller:

r1526 remove a implementação de lang com xml/xsl por:

  • Estar com pt-br hardcoded
  • Não ter relação alguma com este ticket
  • Ficar totalmente fora do padrão dos outros módulos e deixar mais lento sem necessidade

Seria bacana testar isso no sandbox...

comment:17 Changed 11 years ago by niltonneto

Por se tratar de uma implementação "experimental", com o intuito de diminuir o tamanho da variável $_SESSION, também concordo com William.

comment:18 Changed 11 years ago by amuller

O intuito da implementação em questão não é a diminuição da variável $_SESSION e sim uma estruturação diferente da internacionalização. Não que eu ache ruim, mas acho que deve ser tratado em outra discussão.

comment:19 Changed 11 years ago by wmerlotto

  • Milestone changed from Expresso 2.1 to Expresso 2.2

comment:20 Changed 10 years ago by amuller

  • Owner changed from amuller to ninguem
  • Status changed from assigned to new

comment:21 Changed 10 years ago by niltonneto

Ticket #1007 elimina "cache" desnecessário de algumas informações.

comment:22 Changed 10 years ago by amuller

r3152 libera alguns elementos não referenciados. Não é bem o ideal alocar depois liberar, mas é o que é possível.

comment:23 Changed 10 years ago by amuller

r3153 aplica no trunk

comment:24 Changed 10 years ago by niltonneto

  • Owner changed from ninguem to amuller

Muller, favor verificar a imagem comitada dentro das revisões r3152 e r3153.

comment:25 Changed 10 years ago by amuller

  • Status changed from new to closed
  • Resolution set to fixed
  • Severity set to média
Note: See TracTickets for help on using tickets.