O PHP * tem * para serializar / desserializar os dados da sessão entre cada solicitação HTTP? Ou existe uma configuração apenas para manter as sessões na memória?

2

Eu acho que eu entendo porque as sessões são ruins, mas para a experiência do usuário mal-humorada eu não quero ter que re-consultar o banco de dados em cada solicitação HTTP. (Como uma comparação, os servlets Java podem facilmente manter muitos objetos de sessão na memória.)

O PHP pode ser configurado para fazer isso ou precisa ser serializado porque é executado a partir do CGI / FastCGI e, portanto, por definição, é um novo processo cada vez que uma solicitação é enviada? Eu estarei executando o PHP usando o LAMP.

    
por Pete Alvin 14.06.2010 / 13:43

1 resposta

3

Na verdade, o modo como o PHP lida com as sessões é muito melhor que o seu exemplo de Servlet. Deixe-me explicar.

Com o PHP (por padrão), uma sessão é representada por um arquivo no sistema de arquivos. Quando você chama session_start() , ele verifica se existe um arquivo e o carrega em caso afirmativo. Caso contrário, cria um e depois bloqueia. Isso tem dois benefícios principais. Primeiro, permite que muitos processos no mesmo servidor "compartilhem" os dados da sessão. Segundo, se alguém tentar DDOS em seu site, os dados da sessão não o farão baixar (seu afunilamento estará em outro lugar, você não precisa se preocupar em trocar ou ficar sem espaço de memória porque você tem muitas sessões). / p>

Os métodos de serialização / desserialização em php são realmente eficientes, pois são escritos em C e, portanto, compilados. Então esse não é o gargalo. A razão pela qual as sessões do PHP são freqüentemente chamadas de evil é que elas estão bloqueando. Quando você abre um arquivo de sessão, ele obtém um bloqueio exclusivo no arquivo (ou bloqueia até que seja feito). Ele mantém esse bloqueio até que a sessão seja fechada (por final de script, ou por session_write_close() . Isso é desejável, pois evita problemas de simultaneidade. Mas perceba que se você tiver uma solicitação de execução longa e tentar fazer outra enquanto está executando , você vai bloquear.

Agora, a verdadeira beleza do método PHP, é que você pode substituir o manipulador de sessão por um manipulador de sessão userland (Armazenar dados da sessão em um banco de dados, memcached, NoSQL db, etc). Por que isso é bom? Porque, com o mesmo código, você pode migrar de um único servidor para vários. Tudo o que você precisa fazer é chamar session_set_save_handler() ...

Agora, quanto ao seu "Não quero consultar novamente o banco de dados em cada solicitação", pergunto por que não? Tudo o que você está fazendo é uma simples pesquisa de PK. A menos que você realmente manipule o esquema, até mesmo as instruções update / write / delete devem ser REALMENTE eficientes. Eu sugiro ir com uma tabela de memória (no MySQL), pois é mais rápido e você realmente não se importa em manter os dados se o servidor for reiniciado. Se você está preocupado, instale o memcached e deixe que ele manipule o armazenamento de sessões (para que você não precise de SQL) ...

    
por 14.06.2010 / 15:03