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)


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 .


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.


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.