HOWTO · PHP
Definir o tempo limite da sessão em PHP
Este tutorial explica como implementar um tempo limite de sessão em PHP após 30 minutos de inatividade, registrando e verificando o horário da última solicitação.
Nesta página
O PHP não encerra automaticamente uma sessão da aplicação após um período definido de inatividade. Para aplicar um tempo limite de 30 minutos, armazene em $_SESSION o horário da última solicitação, compare-o com o horário atual em cada solicitação e tome uma medida quando a diferença atingir ou ultrapassar 1.800 segundos. O tempo limite é detectado na próxima solicitação após o período ocioso; o servidor não pode agir no instante em que o navegador deixa de enviar solicitações.
Como acompanhar o tempo limite de sessão em PHP
Chame session_start() antes de ler ou alterar $_SESSION. Na primeira solicitação, ainda não há um horário de atividade salvo, então inicialize-o. Nas solicitações seguintes, compare o horário salvo com time(). Se o limite de 1.800 segundos for atingido, limpe os dados da sessão e encerre a solicitação; caso contrário, atualize o horário de atividade para iniciar novamente o período de 30 minutos.
Execute este exemplo:
O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.
<?php
session_start();
$timeoutSeconds = 30 * 60;
$now = time();
if (isset($_SESSION['last_activity']) &&
$now - $_SESSION['last_activity'] >= $timeoutSeconds) {
session_unset();
session_destroy();
echo "Session expired" . PHP_EOL;
exit;
}
$_SESSION['last_activity'] = $now;
echo "Session active" . PHP_EOL;
Session active
Na primeira solicitação, last_activity é inicializado e o fluxo ativo é seguido. Cada solicitação seguinte verifica o horário anterior antes de atualizá-lo. A evidência de execução fornecida informa Session active, com código de saída 0, para o fluxo ativo. Ela não mostra a execução do fluxo de sessão expirada. Em uma aplicação, coloque esta verificação depois de session_start() e antes das operações protegidas, para que uma solicitação expirada não seja processada como autenticada.
Destruir uma sessão após 30 minutos de inatividade
Quando o tempo limite é atingido, o exemplo usa session_unset() e session_destroy(). session_unset() remove as variáveis da sessão atual, enquanto session_destroy() remove os dados da sessão armazenados pelo manipulador de sessões ativo. Destruir os dados no servidor não remove, por si só, o cookie de sessão do navegador. Se a aplicação também precisar expirar esse cookie, deverá enviar um cookie expirado com as mesmas configurações de nome, caminho e domínio; o tratamento do cookie depende da configuração de sessão da aplicação.
Este é um tempo limite aplicado pela aplicação: a verificação só é executada quando uma solicitação chega ao código que a realiza. As configurações de tempo de vida do armazenamento de sessões do PHP controlam a limpeza do armazenamento e são independentes desta política de inatividade verificada a cada solicitação. Consulte o Manual do PHP para session_unset() e as opções de configuração de sessão.
Remover uma variável de sessão com unset()
Use unset($_SESSION['cart']) para remover uma entrada e manter disponíveis as demais entradas da sessão. Isso é adequado quando alguém remove um dado específico, como um carrinho, sem encerrar a sessão inteira. Essa ação, por si só, não implementa um tempo limite de inatividade. Para agrupar valores relacionados, armazene-os sob uma chave de array e remova somente essa chave com unset($_SESSION['account_state']); não substitua o array por um horário se a verificação posterior do tempo limite espera encontrar um elemento registered.
A superglobal $_SESSION fica disponível após session_start(). Consulte o Manual do PHP para $_SESSION.
Regenerar o ID de sessão separadamente do tratamento do tempo limite
session_regenerate_id() substitui o identificador da sessão atual; não mede a inatividade, não destrói os dados da sessão nem exige automaticamente que a pessoa faça login novamente. Use essa função para aplicar uma política de rotação de identificadores em um ponto adequado do fluxo de autenticação da aplicação, independentemente da verificação do tempo limite. A retenção dos dados antigos da sessão depende das opções da função e do tratamento de sessões; portanto, não considere a regeneração, por si só, um logout ou uma prova de que o identificador anterior deixou de ser utilizável.
A função session_id() lê o identificador atual, enquanto session_start() retoma a sessão associada à solicitação. Para saber mais, consulte o Manual do PHP para session_regenerate_id() e a função session_id().