HTTP é um protocolo sem estado por um motivo. Sessões soldam o estado no HTTP. Como regra geral, evite usar o estado da sessão.
UPDATE: Não há conceito de sessão no nível HTTP; os servidores fornecem isso fornecendo ao cliente um ID exclusivo e solicitando que o reenvie a cada solicitação. Em seguida, o servidor usa esse ID como chave em uma grande hashtable de objetos Session. Sempre que o servidor recebe uma solicitação, ele procura as informações da Sessão em seus hashtable de objetos de sessão com base no ID que o cliente enviou com a solicitação. Todo esse trabalho extra é um golpe duplo na escalabilidade (uma grande razão pela qual o HTTP é sem estado).
- Whammy One: reduz o trabalho que um único servidor pode fazer.
- Whammy Two: torna mais difícil o dimensionamento, porque agora você não pode simplesmente encaminhar uma solicitação para qualquer servidor antigo - eles nem todos têm a mesma sessão. Você pode fixar todas as solicitações com um determinado ID de sessão no mesmo servidor. Isso não é fácil e é um ponto único de falha (não para o sistema como um todo, mas para grandes partes de seus usuários). Ou então, você pode compartilhar o armazenamento da sessão em todos os servidores do cluster, mas agora tem mais complexidade: memória conectada à rede, um servidor de sessão independente etc.
Dado tudo isso, quanto mais informações você colocar na sessão, maior será o impacto no desempenho (como Vinko aponta). Também como Vinko aponta, se o seu objeto não for serializável, a sessão se comportará mal. Portanto, como regra geral, evite colocar mais do que o absolutamente necessário na sessão.
@Vinko Geralmente, você pode contornar o estado de armazenamento do servidor incorporando os dados que está rastreando na resposta que você envia de volta e fazendo com que o cliente os reenvie, por exemplo, enviando os dados para baixo em uma entrada oculta. Se você realmente precisa do rastreamento de estado no servidor, provavelmente deve estar no seu armazenamento de dados de backup.
(Vinko acrescenta: o PHP pode usar um banco de dados para armazenar informações da sessão e fazer com que o cliente reenvie os dados a cada vez pode resolver possíveis problemas de escalabilidade, mas abre uma grande lata de problemas de segurança que você deve prestar atenção agora que o cliente está no controle de todos seu estado)