Diferentes formas de fechar sessão em PHP

Como fechar uma sessão autenticada corretamente, por inatividade ou por fechamento do navegador por parte do usuário.

Por Eugenia Bahit


Publicado em: 15/2/08
Valorize este artigo:
Veremos como fechar a sessão do usuário quando:
  • O tempo de inatividade do usuário supere "x" quantidade de tempo (segundos, minutos, etc...).
  • O usuário feche o navegador e abandone por completo nosso site.
Fechamento de sessão por inatividade em PHP: módulo de controle de dados

Algo que pode parecer muito óbvio para uns e muito complexo para outros, mas que inegavelmente muitos de nós já nos perguntamos em algum momento: Como expirar uma sessão em PHP?

Agora veremos que simples é. Só temos que:
  • Criar uma nova sessão que salve uma data e hora
  • Comprovar em nossa camada de segurança o tempo transcorrido entre a sessão salva e a hora atual
  • Atualizar a sessão ou destruí-la segundo corresponda
O primeiro que devemos fazer então, é criar a nova seção e atribuir-lhe como valor, a hora atual. Faremos isto no momento que o usuário entra no sistema com seus dados de acesso.

<?
//vemos se o usuário e senha são válidos
if ($_POST["usuario"]=="miguel" && $_POST["senha"]=="qwerty"){
    //usuario e senha válidos
    session_name("loginUsuario");
    //atribui um nome à sessão para poder salvar diferentes dados
   session_start();
    // inicio l sessão
    $_SESSION["autenticado"]= "SI";
    //defino a sessão que demonstra que o usuário está autorizado
    $_SESSION["ultimoAcesso"]= date("Y-n-j H:i:s");
    //defino a data e hora de inicio de sessão em formato aaaa-mm-dd hh:mm:ss
    header ("Location: aplicacao.php");
}else {
    //se não existe lhe mando outra vez ao portal
    header("Location: index.php?errousuario=si");
}
?>


Fechamento de sessão por inatividade em PHP: módulo de segurança

O segundo passo, será comprovar o tempo transcorrido entre a data salva e a hora atual em nossa camada de segurança e atuar em conseqüência.

Para fazê-lo, teremos que realizar um cálculo muito simples:

    tempo transcorrido = (hora atual - data salva)

E logo, restará saber se o tempo transcorrido é maior, menor ou igual que o tempo de expiração da sessão (representado como "x"):

    se (tempo transcorrido >= x), atuo em conseqüência ao achado

Para efetuar estes cálculos utilizaremos como unidade de tempo o segundo. Em nosso exemplo, expiraremos a sessão, transcorridos 10 minutos de inatividade (onde: 10*60 = 600 segundos). Para efetuar estes cálculos e tomar como unidade de medida o segundo, será necessário converter as datas a segundos. Para isso, utilizaremos a função strtotime.

Portanto, calcularemos o tempo transcorrido (tempo transcorrido = (hora atual - data salva)) da seguinte maneira:

<?
//iniciamos a sessão
session_name("loginUsuario");
session_start();

//antes de fazer os cálculos, comprovo que o usuário está logado
//utilizamos o mesmo script que antes
if ($_SESSION["autenticado"] != "SI") {
    //se não está logado o envio à página de autenticação
    header("Location: index.php");
} else {
    //senão, calculamos o tempo transcorrido
    $dataSalva = $_SESSION["ultimoAcesso"];
    $agora = date("Y-n-j H:i:s");
    $tempo_transcorrido = (strtotime($agora)-strtotime($dataSalva));

    //comparamos o tempo transcorrido
     if($tempo_transcorrido >= 600) {
     //se passaram 10 minutos ou mais
      session_destroy(); // destruo a sessão
      header("Location: index.php"); //envio ao usuário à página de autenticação
      //senão, atualizo a data da sessão
    }else {
    $_SESSION["ultimoAcesso"] = $agora;
   }
}
?>





Comentários do artigo
Foram enviados 5 comentários ao artigo
4 comentários não revisados
1 comentário revisado:
funcionou!
Por: wagner
15/3/09
solucao muito criativa e eficiente! Parabens!
tentei de tudo e nao conseguia resolver este problema com os comandos session_cache_expire()

Usuários :    login / registro

Manuais relacionados
Categorias relacionadas
O autor

Home | Sobre nós | Copyright | Anuncie | Entrar em contato