Sessões do PHP: onde ficam, e porque é que os utilizadores são desligados

Uma sessão do PHP é um pequeno ficheiro no servidor, ligado ao visitante por um cookie (o PHPSESSID). É lá que a aplicação guarda quem está autenticado, o que está no carrinho, e por aí fora. Quando um utilizador “é desligado sem razão”, uma de duas coisas aconteceu: o ficheiro desapareceu, ou o cookie deixou de chegar.

As causas, da mais comum à mais rara

Causa Como se reconhece O que fazer
Tempo de vida curto Desliga depois de uns minutos parado, mas não a meio de uma tarefa. O PHP limpa os ficheiros de sessão parados há mais do que o session.gc_maxlifetime, que por omissão é curto. Suba-o, e acerte o tempo do cookie na própria aplicação.
Mudou a versão do PHP Todos os utilizadores foram desligados de uma vez, uma única vez. É normal: cada versão do PHP guarda as sessões na sua própria pasta. Não volta a acontecer.
www e sem www, ou http e https Fica autenticado num endereço e desautenticado no outro. O cookie pertence a um endereço. Escolha um só e redirecione o outro. Veja .htaccess para projectos PHP.
Cache a servir páginas já autenticadas Um utilizador vê o nome de outro, ou fica “desligado” só em algumas páginas. A cache de páginas (do plugin ou de um CDN) tem de excluir as páginas autenticadas.
O PHP não consegue escrever a sessão Aviso “Failed to write session data”, ou sessões que nunca ficam. O espaço da conta chegou ao fim, ou a pasta de sessões não tem permissão. Veja o espaço no cPanel.
session_start() tarde demais O aviso “headers already sent” aparece, e o cookie nunca é enviado. O session_start() tem de correr antes de qualquer texto sair, incluindo espaços antes do <?php. É um defeito do código.

Dar à sua aplicação uma pasta de sessões própria

Só vale a pena se precisa de um tempo de vida diferente do resto, ou se quer as sessões fora do sítio por omissão. Não é preciso para o dia a dia.

1 No File Manager, crie uma pasta fora da pasta pública, por exemplo /home/SUACONTA/sessoes, e dê-lhe a permissão 700.
2 Na pasta da aplicação, acrescente ao .user.ini as linhas abaixo. Veja onde pôr cada valor.
3 Espere uns minutos, inicie sessão no site e confirme que apareceu um ficheiro novo na pasta.

session.save_path = "/home/SUACONTA/sessoes"
session.gc_maxlifetime = 7200

O segundo valor está em segundos e é um exemplo.

Não ponha a pasta de sessões dentro de public_html. Um ficheiro de sessão é uma chave de entrada: quem o conseguir ler pode agir como o utilizador.
“Manter-me autenticado” é uma funcionalidade da aplicação, não do PHP. Normalmente cria um segundo cookie, de longa duração. Se a aplicação não o oferece, subir o gc_maxlifetime tão alto quanto se quiser não resolve: o cookie da sessão morre quando o navegador fecha.

Os utilizadores continuam a ser desligados e já percorreu a tabela? Diga-nos o endereço e a hora a que aconteceu.

Abrir um pedido de suporte

VEJA TAMBÉM

php.ini e .user.ini: onde pôr cada valor

Onde está o registo de erros do PHP

.htaccess para projectos PHP: URLs amigáveis e redireccionamentos

Mudar a versão do PHP sem partir o site

PRODUTO RECOMENDADO

Alojamento de sites com cPanel

Domínio e SSL incluídos, cópias diárias e o painel que já conhece. desde 5.940,00 Kz/mês (plano de 3 anos, com cupão)

Ver planos
  • 0 Utilizadores acharam útil
Esta resposta foi útil?