Como reiniciar o Apache sem redefinir as sessões dos usuários?

8

O usuário está logado em um site PHP> Eu reinicio o Apache> O usuário precisa efetuar login novamente.

Como evitar isso? (Não quero que o usuário precise fazer login novamente)

dowik
fonte
Para verificar: você tem a capacidade de editar o PHP, certo?
Peter Taylor
Se for seu próprio aplicativo, sugiro o que @Jacob Hume abaixo sugeriu e altere seu aplicativo para armazenar sessões em uma tabela de banco de dados. Isso, na minha opinião, oferece mais controle sobre o seu site, pois você pode forçar os usuários a sair, se necessário de forma seletiva.
Anagio
Eu posso editar PHP. Estou usando um CMS (Drupal). Também estou usando a APC e estava procurando uma solução dessa maneira.
Dowik 13/03/12

Respostas:

6

Armazenar um token de sessão em um local alternativo como um backup impediria esse problema. Você ainda pode manter suas informações principais $_SESSION, mas mantenha um token de backup em:

  • Biscoitos
  • Registros de banco de dados
  • Armazenamento local em HTML5

Você pode encontrar ajuda nesta pergunta do StackOverflow: práticas recomendadas para o tempo limite da sessão e o login persistente no php .

Jacob Hume
fonte
Obrigado pela resposta e obrigado pelo link. Eu estava procurando uma solução no arquivo de configuração do lado do servidor (tipo "manter sessões durante a reinicialização"). Mas parece que a solução está no lado do aplicativo.
Dowik 13/03/12
Oh meu ... Na verdade, eu estava simplesmente procurando por "apache2ctl -k graceful"!
Dowik 13/03/12
3

Os dados da sua sessão não devem ser perdidos apenas porque o Apache é encerrado ou reiniciado, a menos que os dados da sessão estejam sendo armazenados na memória e não sejam armazenados em backup no disco (pelo sistema de arquivos ou pelo banco de dados). Caso contrário, você poderá reiniciar o servidor inteiro e a sessão ainda persistirá. Os dados da sessão foram projetados para serem armazenados a longo prazo. A única vez que a sessão é perdida é se:

  1. O SID está perdido. Os dados da sessão ainda existem no lado do servidor, mas o cliente não consegue recuperar o SID, portanto, não pode reiniciar a mesma sessão. Isso pode acontecer se o cookie SID expirar (se for um cookie) ou se os links da sessão forem perdidos (se o SID for um parâmetro de URL) ou se o SID estiver desconfigurado no servidor ou alterado sem notificar o cliente.

  2. Os dados da sessão são excluídos do lado do servidor. Isso geralmente acontece quando o PHP Session Garbage Collector é executado e vê que o arquivo da sessão é mais antigo que session.gc_maxlifetime (que é de 24 minutos por padrão). Caso contrário, isso pode acontecer se o aplicativo excluir explicitamente a sessão . Em alguns servidores, o administrador também pode ter configurado um cronjob para limpar regularmente os dados antigos da sessão.

Lèse majesté
fonte
Obrigado pelos detalhes. Eu vou investigar dessa maneira. Mas agora, vou simplesmente usar o reinício gracioso que parece atender à minha necessidade.
Dowik 13/03/12
@dowik: Como um reinício gracioso se ajusta à sua necessidade? O seu problema perdeu sessões ou downloads interrompidos? Se for o último, o reinício / desligamento gracioso realmente resolverá isso. Mas você deve editar sua pergunta para refletir isso. Como as reinicializações simples não têm nada a ver com as sessões PHP, e isso não ajudará outros usuários que tentam impedir a perda de sessões.
Lèse majesté 13/03/2012
Eu tentei atualizar o título da minha pergunta substituindo "sessões PHP" por "sessões de usuários", como descrever no corpo da minha pergunta. Melhor para você? Para ser mais preciso: eu uso a APC. Quando altero o código nos arquivos PHP, preciso liberar o cache da APC (reiniciar o Apache é a maneira mais simples de fazer isso). Com o argumento "restart", os usuários do meu site precisam fazer login novamente. Enquanto com "gracioso", eles não. É por isso que "isso parece atender à minha necessidade".
Dowik 13/03/12
@dowik: Eu não acho que isso tenha algo a ver com o reinício gracioso. Você provavelmente teve uma reinicialização que coincidiu com o coletor de lixo das sessões PHP. Entre novamente e tente reiniciar regularmente imediatamente depois. A menos que você esteja armazenando sessões na memória (MM), a sessão será salva.
Lèse majesté 13/03/2012
1

Tornado possível usando o argumento correto com o Apache:

apache2ctl -k graceful

O Apache será reiniciado sem perder as sessões atuais.

dowik
fonte
2
O reinício gracioso apenas adia o desligamento até que as conexões atuais sejam encerradas. Não altera o comportamento de reinicialização.
Lèse majesté 13/03/2012