Pergunta

Eu só descobri que eu realmente pode armazenar objetos no $ _SESSION e acho que é muito legal porque quando eu ir para outra página ainda tenho meu objeto. Agora, antes de começar a usar esta abordagem que eu gostaria de saber se é realmente uma idéia tão boa ou se houver armadilhas potenciais envolvidos.

Eu sei que se eu tivesse um único ponto de entrada eu não precisaria fazer isso, mas eu não estou lá ainda, então eu não ter um único ponto de entrada e eu realmente gostaria de manter meu objeto porque Eu não perco meu estado assim. (Agora eu também li que eu deveria programar sites de apátridas, mas eu não entendo esse conceito ainda.)

Assim em suma :? É ok para armazenar objetos na sessão, existem quaisquer problemas com ele


Editar:

resumo temporária : Até agora eu entendo que é provavelmente melhor para recriar o objeto, mesmo se envolver consultando o banco de dados novamente.

Outras respostas poderia talvez elaborar sobre esse aspecto um pouco mais!

Foi útil?

Solução

Eu sei que este tema é antiga, mas esta questão continua a subir e não tem sido dirigida para a minha satisfação:

Se você salvar objetos em $ _SESSION, ou reconstruí-las pano inteiro com base em dados escondidos nos campos de formulário ocultos, ou re-consulta-los do DB cada vez, você está usando o estado. HTTP é apátrida (mais ou menos, mas ver GET vs. PUT), mas quase cuidados tudo ninguém a fazer com um aplicativo web requer estado a ser mantido em algum lugar. Agindo como se empurrando o estado em cantos e recantos valores a algum tipo de vitória teórica é apenas errado. Estado é Estado. Se você usar o estado, você perde as várias vantagens técnicas adquiridas por ser apátrida. Isso não é algo para perder o sono durante a menos que você sabe de antemão que você deve estar perdendo o sono por isso.

Estou especialmente desconcertado pela bênção recebida pelos argumentos "golpe duplo" apresentadas por Hank Gay. É o OP construção de um sistema distribuído e e-commerce com balanceamento de carga? Meu palpite não é; e eu vou continuar a postular que a serialização de sua classe $ User, ou o que quer, não vai prejudicar o seu servidor além do reparo. Meu conselho: usar as técnicas que são sensíveis à sua aplicação. Objetos em $ _SESSION são muito bem, sujeito a precauções de senso comum. Se seu aplicativo de repente se transforma em algo rivalizando Amazon no tráfego servido, você vai precisar de re-adaptação. Isso é vida.

Outras dicas

É ok, desde que no momento em que a chamada session_start () é feita, a declaração de classe / definição já foi encontrado por PHP ou podem ser encontrados por um carregador automático já instalado. caso contrário ele não seria capaz de desserializar o objeto do armazenamento de sessão.

HTTP é um protocolo sem estado por uma razão. Sessões soldar estado em HTTP. Como regra geral, evite usar o estado da sessão.

UPDATE: Não existe o conceito de uma sessão no nível HTTP; servidores fornecem isso, dando ao cliente uma identificação única e dizer ao cliente para reenviá-lo em cada solicitação. Em seguida, o servidor usa essa identificação como uma chave em um grande hashtable de objetos de sessão. Sempre que o servidor recebe uma solicitação, ele procura as informações de sessão fora de seu hashtable da sessão de objetos com base na identificação do cliente submetido com o pedido. Todo este trabalho extra é um golpe duplo na escalabilidade (a grande razão HTTP é apátrida).

  • Whammy One:. Ele reduz o trabalho de um único servidor pode fazer
  • Whammy Dois: Isso torna mais difícil de escalar, porque agora você não pode simplesmente encaminhar uma solicitação para qualquer servidor de idade - eles não têm todos a mesma sessão. Você pode fixar todas as solicitações com um determinado ID da sessão para o mesmo servidor. Isso não é fácil, e é um ponto único de falha (não para o sistema como um todo, mas para grandes pedaços de seus usuários). Ou, você poderia compartilhar o armazenamento de sessão em todos os servidores no cluster, mas agora você tem mais complexidade:. Memória conectado à rede, um servidor sessão de stand-alone, etc

Diante de tudo isso, o mais informações você colocar na sessão, maior o impacto no desempenho (como aponta Vinko fora). Também como Vinko aponta, se o seu objeto não é serializável, a sessão irá se comportar mal. Assim, como regra geral, evite colocar mais do que o absolutamente necessário na sessão.

@Vinko Você pode geralmente trabalham em torno de ter estado armazenamento do servidor, incorporando os dados que você está acompanhando na resposta que você enviar de volta e ter o cliente reenviá-lo, por exemplo, enviar os dados para baixo em uma entrada escondida. Se você realmente necessidade de monitoramento do lado do servidor de estado, ele provavelmente deve estar em seu armazenamento de dados de apoio.

(Vinko acrescenta: PHP pode usar um banco de dados para armazenar informações de sessão, e ter o cliente reenviar os dados cada vez que pode resolver possíveis problemas de escalabilidade, mas abre uma lata grande de questões de segurança você deve prestar atenção ao momento que o cliente está em controle de todo o seu estado)

  • Objetos que não podem ser serializados (ou que contenham membros unserializable) não vai sair da $ _SESSION como seria de esperar
  • sessões enormes colocar uma carga sobre o servidor (serialização e desserialização megas de estado cada vez que é caro)

Outros, que eu vi nenhum problema.

Em minha experiência, geralmente não vale a pena para algo mais complicado do que um StdClass com algumas propriedades. O custo de unserializing sempre foi mais do que recriar a partir de um banco de dados dado um identificador armazenado-sessão. Parece legal, mas (como sempre), de perfil é a chave.

Eu sugeriria não usar o estado, a menos que você absolutamente precisa. Se você pode reconstruir o objeto sem o uso de sessões de fazê-lo. . Tendo estados em sua webapplication torna o aplicativo mais complexo para construir, para cada pedido que você tem que ver o estado em que o usuário está no Claro, há momentos em que você não pode evitar o uso de sessão (exemplo: o usuário tem que ser mantido o login durante a sua sessão sobre o webapplication). Última eu sugeriria manter o seu objeto de sessão tão pequeno quanto possível, como ele afeta o desempenho para serializar e objetos grandes unserialize.

Você tem que lembrar que tipos de recursos (como conexões DB ou ponteiros de arquivo) não vai persistir entre cargas de página, e você vai precisar para invisivelmente recriar estes.

Considere também o tamanho da sessão, dependendo de como ele é armazenado, você pode ter restrições de tamanho, ou problemas de latência.

Também gostaria de trazer para cima quando bibliotecas de software atualização - nós atualizamos nosso software e a versão antiga tinha objetos em sessão com nomes de classe do software V1, o novo software foi quebrando quando ele tentou construir os objetos que estavam na sessão - como o software V2 não usar essas mesmas classes mais, ele não poderia encontrá-los. Tivemos que colocar em algum código de correção para detectar objetos de sessão, eliminar a sessão, se for encontrado, recarregar a página. A maior dor inicialmente você mente foi recriar este bug quando foi relatada pela primeira vez (muito familiar, "bem, ele trabalha para mim" :) uma vez que só afetou pessoas que onde dentro e fora dos antigos e novos sistemas recentemente - no entanto, boa trabalho que fizemos encontrá-lo antes do lançamento como a todos os nossos usuários certamente teria tido as variáveis ??de sessão velhos em suas sessões e teria potencialmente caiu para todos, teria sido uma terrível lançamento:)

De qualquer forma, como você sugere na sua alteração, eu também acho que é melhor para re-criar o objeto. Então, talvez apenas armazenar id e, em seguida, em cada pedido puxando o objeto do banco de dados, é melhor / mais seguro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top