Fechamento de sessão ao fechar o navegador em PHP
Código em PHP para fechar sessões quando se fecha o navegador.Por Eugenia Bahit
Publicado em: 25/2/08
Introdução
Muito mais simples do que se imagina, é fazer com quem uma sessão expire de forma automática quando o usuário fechar o navegador.
À principio, vamos definir a que nos referimos com fechar o navegador.
O servidor entenderá que o usuário fechou o navegador quando já não se encontre visitando nenhuma das páginas de nosso site. Ou seja, se um usuário que para navegar nosso site abriu pelo menos 2 páginas em 2 janelas diferentes, o servidor considerará que fechou o navegador quando até a última janela for abandonada. Seja porque o usuário a fechou ou fora para outro site que não é o nosso.
Então, para que a sessão expire ao fechar o navegador, terá que por um lado, forçar ao php.ini a que propague a sessão somente em cookies e por outro lado, lhe atribuir a esta, uma duração zero.
Para forçar ao php.ini há duas formas: modificar o php.ini diretamente ou mudar os valores desde nosso script.
Opção 1
Configurar o arquivo de início de php (php.ini) em forma direta.
Se tiver acesso a este arquivo, terá que buscar e mudar o valor a:
session.use_trans_sid = 0
session.use_only_cookies = 1
Esta última, justamente será a que indicará que a sessão deve se propagar
só através de cookies.
Opção 2
Mudar a configuração do php.ini através de nosso script php.
Esta opção consiste em forçar ao php.ini através de nosso script php (Nem todos os servidores têm habilitada esta opção. Se o servidor não for próprio, por via das dúvidas, consulte com seu provedor).
Para fazê-lo, utilizaremos a função
ini_set()
ini_set("session.use_trans_sid","0");
ini_set("session.use_only_cookies","1");
Agora só restará, mudar o parâmetro de duração à cookie da
sessão. Faremos isto em nosso script com a seguinte instrução:
session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"],
0);
Com o qual estaremos indicando uma duração e 0 (zero) segundos. Isto significará que durará até que termine o script.
Por fim, chegamos ao código:
Fechamento de sessão ao fechar o navegador em PHP: módulo de controle de dados
Você verá refletidas as mudanças ao script anterior, indicadas em
negritos. Estas mudanças serão também as que se apliquem ao módulo de segurança. De qualquer
forma, exponho aqui os dois códigos.
<?
//se for necessário mudar a config. Do php.ini através de seu script
ini_set("session.use_only_cookies","1");
ini_set("session.use_trans_sid","0");
//vemos se o usuário e senha são válidos
if ($_POST["usuario"]=="miguel" && $_POST["senha"]=="qwerty"){
//usuário e senha válidos
session_name("loginUsuario");
//atribuo um nome à sessão para poder salvar diferentes dados
session_start();
// inicio a sessão
session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0);
//mudamos a duração à cookie da 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 a hora de início 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 ao fechar o navegador em PHP: módulo de controle de dados
Você verá refletidas as mudanças ao script anterior, indicados em
negritos.
<?
//se for necessário mudar a config. do php.ini através de seu script
ini_set("session.use_only_cookies","1");
ini_set("session.use_trans_sid","0");
//iniciamos a sessão
session_name("loginUsuario");
session_start();
session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0);
//mudamos a duração à cookie da sessão
//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 estiver 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 o usuário à pag. de autenticação
//senão, atualizo a data da sessão
}else {
$_SESSION["ultimoAcesso"] = $agora;
}
}
?>
Comentários do artigo