You are on page 1of 8

Sesses em PHP As sesses so mtodos de manter (ou preservar) determinados dados a mant-los ativos enquanto o navegador do cliente (o internauta)

estiver aberto, ou enquanto a sesso no expirar (por inatividade, ou porque em algum ponto voc mandou que ela expirasse). Um problema que atormenta os programadores iniciantes e de nvel intermedirio a transferncia ou disponibilizao de variveis entre vrias pginas. Na linguagem PHP costuma-se usar os mtodos POST ou GET que, mesmo sendo bastante simples, ainda causam confuso. Imagine agora o tamanho da encrenca se quisermos disponibilizar dados que sejam exclusivos para cada um dos usurios. A tbua da salvao so as funes de gerenciamento do todo poderoso PHP. Session As funes para manipulao de sesses oferecidas pelo PHP permitem preservar dados ao longo de acessos subsequentes. Cada visitante que acessar seu site recebe uma identificao nica chamada de ID de sesso. Esta ID pode ser armazenada num cookie na mquina do usurio ou ser propagada atravs da URL. Uma vez criada, a sesso pode registrar variveis que ficaro disponveis no array $_SESSION, de escopo global, enquanto voc no encerrar compulsoriamente a sesso ou se o tempo de vida da mesma no tiver se esgotado. Para "pilotar" sesses o PHP disponibiliza um arsenal de funes fceis de serem aplicadas quando se entende o princpio do mecanismo SESSION.

Funes da SESSION
y y y y y y y y y y y y y y y y y y

session_cache_expire -- Retorna quando o cache atual expira session_cache_limiter -- Obtm e/ou define o limitador do cache atual session_commit -- O mesmo que session_write_close() session_decode -- Decodifica os dados da seo a partir de uma string codificada session_destroy -- Destri todos os dados registrados na sesso session_encode -- Codifica os dados da seo numa string session_get_cookie_params -- Obtm os parmetros do cookie da sesso session_id -- Obtm e/ou define a ID da sesso ativa session_is_registered -- Verifica se uma varivel global foi registrada session_module_name -- Obtm e/ou define o mdulo da sesso session_name -- Obtm e/ou define o nome da sesso session_regenerate_id -- Atualiza a ID da sesso substituindo-a por uma nova session_register -- Registra uma ou mais variveis globais session_save_path -- Obtm e/ou define o caminho para salvar os dados da sesso/li> session_set_cookie_params -- Define os parmetros do cookie da sesso session_set_save_handler -- Define funes de armazenamento da sesso em nvel de usurio session_start -- Inicializa os dados da sesso session_unregister -- Cancela o registro de uma varivel global da sesso

y y

session_unset -- Libera todas as variveis da sesso session_write_close -- Escreve os dados da sesso e a encerra

Iniciando uma sesso Pode-se usar tanto a funo session_start quanto a funo session_register para iniciar uma sesso. A funo session_register, por padro, chama a funo session_start para verificar se j h ou no uma sesso aberta: se no houver, uma nova sesso inicializada; se houver, o trabalho continua na sesso que j est inicializada. <?php // Inicializar a sesso session_start(); // Registrar variveis if (!session_is_registered("conta")) { $conta = 1; $inicio = time(); session_register("conta"); session_register("inicio"); } else { $_SESSION["conta"] = $_SESSION["conta"] + 1; } ?> <html> <head><title>Sesses</title></head> <body> <p>contador = <?php echo $_SESSION["conta"]; ?></p> <p>Esta sesso j est durando <?php echo time() - $inicio; ?> segundos.</p> </body> </html> ?> Quando um usurio acessar esta pgina pela primeira vez, a instruo session_start inicializa uma nova sesso porque, para este usurio, ainda no existe uma sesso definida; se um usurio que j possui uma sesso acessar novamente esta pgina, ento a sesso apenas reativada. A instruo session_start (ou session_register) PRECISA ser chamada ANTES de qualquer sada HTML! por este motivo que o cdigo PHP precede o cdigo HTML. Logo em seguida so definidas as variveis $conta e $inicio. A varivel $conta recebe o valor inicial 1 e a varivel $incio guarda a data e a hora do primeiro acesso. Estas so registradas na sesso usando a funo session_register. Observe que, para registrar uma varivel, usa-se o nome da varivel entre aspas, ou seja, "conta" ao invs de $conta. Novos valores para variveis da sesso podem ser registrados atravs da funo session_register ou diretamente no array da sesso. Observe que o valor da varivel

"conta" atualizado usando o segundo mtodo (linha 13). Para acessar um dos elementos do array, utiliza-se o nome do mesmo ($_SESSION, que precisa ser escrito com letras maisculas!) com o nome do elemento entre aspas e entre colchetes (e no entre parnteses!). Verificando a sua sesso Quando voc acessou esta pgina pela primeira vez, voc abriu uma sesso s para voc. O resultado o seguinte:
y y

Contador: 1 Durao: 0 segundos

Se voc recarregar esta pgina, o contador vai mostrar um acesso adicional e um tempo maior de durao da sua sesso.

O pulo do gato Mas qual a vantagem de ciscar valores de variveis de uma sesso para us -los na mesma pgina? Eu diria que a vantagem pouca ou quase zero. Acontece q mesmo ue, que o usurio que abriu a sesso troque de pgina, a sesso no extinta, ou seja, as variveis registradas continuam nossa disposio. Melhor do que isto, no preciso colocar estas variveis e seus valores em campos escondidos (hidden) de formulrios ou como parmetros no endereo de links para transferi-las para outras pginas - as variveis e seus valores ficam na retaguarda, gerenciadas pelo PHP, prontas para serem usadas quando for conveniente. Como ciscar os valores? Ficando no exemplo dado, basta adicionar um <?php echo $_SESSION["conta"]; ?> ou <?php echo time() - $_SESSION["inicio"]; ?> em qualquer ponto de qualquer outra pgina para obter os valores desejados. a que est o pulo do gato. Diferentes formas de fechar sesso em PHP Como fechar uma sesso autenticada corretamente, por inatividade ou por fechamento do navegador por parte do usurio.
y y

O tempo de inatividade do usurio supere "x" quantidade de tempo (segundos, minutos, etc...). O usurio feche o navegador e abandone por completo nosso site.

Fechamento de sesso por inatividade em PHP: mdulo de controle de dados Algo que pode parecer muito bvio para uns e muito complexo para outros, mas que

inegavelmente muitos de ns j nos perguntamos em algum momento: Como expirar uma sesso em PHP? Agora veremos que simples . S temos que:
y y y

Criar uma nova sesso que salve uma data e hora Comprovar em nossa camada de segurana o tempo transcorrido entre a sesso salva e a hora atual Atualizar a sesso ou destru-la segundo corresponda

O primeiro que devemos fazer ento, criar a nova seo e atribuir-lhe como valor, a hora atual. Faremos isto no momento que o usurio entra no sistema com seus dados de acesso. <? //vemos se o usurio e senha so vlidos if ($_POST["usuario"]=="miguel" && $_POST["senha"]=="qwerty"){ //usuario e senha vlidos session_name("loginUsuario"); //atribui um nome sesso para poder salvar diferentes dados session_start(); // inicio l sesso $_SESSION["autenticado"]= "SI"; //defino a sesso que demonstra que o usurio est autorizado $_SESSION["ultimoAcesso"]= date("Y-n-j H:i:s"); //defino a data e hora de inicio de sesso em formato aaaa-mm-dd hh:mm:ss header ("Location: aplicacao.php"); }else { //se no existe lhe mando outra vez ao portal header("Location: index.php?errousuario=si"); } ?> Fechamento de sesso por inatividade em PHP: mdulo de segurana O segundo passo, ser comprovar o tempo transcorrido entre a data salva e a hora atual em nossa camada de segurana e atuar em conseqncia. Para faz-lo, teremos que realizar um clculo muito simples:

tempo transcorrido = (hora atual - data salva) E logo, restar saber se o tempo transcorrido maior, menor ou igual que o tempo de expirao da sesso (representado como "x"): se (tempo transcorrido >= x), atuo em conseqncia ao achado Para efetuar estes clculos utilizaremos como unidade de tempo o segundo. Em nosso exemplo, expiraremos a sesso, transcorridos 10 minutos de inatividade (onde: 10*60 = 600 segundos). Para efetuar estes clculos e tomar como unidade de medida o segundo, ser necessrio converter as datas a segundos. Para isso, utilizaremos a funo strtotime. Portanto, calcularemos o tempo transcorrido (tempo transcorrido = (hora atual - data salva)) da seguinte maneira: <? //iniciamos a sesso session_name("loginUsuario"); session_start(); //antes de fazer os clculos, comprovo que o usurio est logado //utilizamos o mesmo script que antes if ($_SESSION["autenticado"] != "SI") { //se no est logado o envio pgina de autenticao header("Location: index.php"); } else { //seno, 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 sesso header("Location: index.php"); //envio ao usurio pgina de autenticao //seno, atualizo a data da sesso }else {

$_SESSION["ultimoAcesso"] = $agora; } } ?> Cdigo em PHP para fechar sesses quando se fecha o navegador. Introduo Muito mais simples do que se imagina, fazer com quem uma sesso expire de forma automtica quando o usurio fechar o navegador. principio, vamos definir a que nos referimos com fechar o navegador. O servidor entender que o usurio fechou o navegador quando j no se encontre visitando nenhuma das pginas de nosso site. Ou seja, se um usurio que para navegar nosso site abriu pelo menos 2 pginas em 2 janelas diferentes, o servidor considerar que fechou o navegador quando at a ltima janela for abandonada. Seja porque o usurio a fechou ou fora para outro site que no o nosso. Ento, para que a sesso expire ao fechar o navegador, ter que por um lado, forar ao php.ini a que propague a sesso somente em cookies e por outro lado, lhe atribuir a esta, uma durao zero. Para forar ao php.ini h duas formas: modificar o php.ini diretamente ou mudar os valores desde nosso script. Opo 1 Configurar o arquivo de incio 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 sesso deve se propagar s atravs de cookies. Opo 2 Mudar a configurao do php.ini atravs de nosso script php. Esta opo consiste em forar ao php.ini atravs de nosso script php (Nem todos os servidores tm habilitada esta opo. Se o servidor no for prprio, por via das dvidas,

consulte com seu provedor). Para faz-lo, utilizaremos a funo ini_set() ini_set("session.use_trans_sid","0"); ini_set("session.use_only_cookies","1"); Agora s restar, mudar o parmetro de durao cookie da sesso. Faremos isto em nosso script com a seguinte instruo: session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0); Com o qual estaremos indicando uma durao e 0 (zero) segundos. Isto significar que durar at que termine o script. Por fim, chegamos ao cdigo: Fechamento de sesso ao fechar o navegador em PHP: mdulo de controle de dados Voc ver refletidas as mudanas ao script anterior, indicadas em negritos. Estas mudanas sero tambm as que se apliquem ao mdulo de segurana. De qualquer forma, exponho aqui os dois cdigos. <? //se for necessrio mudar a config. Do php.ini atravs de seu script ini_set("session.use_only_cookies","1"); ini_set("session.use_trans_sid","0"); //vemos se o usurio e senha so vlidos if ($_POST["usuario"]=="miguel" && $_POST["senha"]=="qwerty"){ //usurio e senha vlidos session_name("loginUsuario"); //atribuo um nome sesso para poder salvar diferentes dados session_start(); // inicio a sesso session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0); //mudamos a durao cookie da sesso $_SESSION["autenticado"]= "SI"; //defino a sesso que demonstra que o usurio est autorizado $_SESSION["ultimoAcesso"]= date("Y-n-j H:i:s"); //defino a data e a hora de incio de sesso em formato aaaa-mm-dd hh:mm:ss header ("Location: aplicacao.php"); }else { //se no existe lhe mando outra vez ao portal header("Location: index.php?errousuario=si"); } ?>

Fechamento de sesso ao fechar o navegador em PHP: mdulo de controle de dados Voc ver refletidas as mudanas ao script anterior, indicados em negritos. <? //se for necessrio mudar a config. do php.ini atravs de seu script ini_set("session.use_only_cookies","1"); ini_set("session.use_trans_sid","0"); //iniciamos a sesso session_name("loginUsuario"); session_start(); session_set_cookie_params(0, "/", $HTTP_SERVER_VARS["HTTP_HOST"], 0); //mudamos a durao cookie da sesso //antes de fazer os clculos, comprovo que o usurio est logado //utilizamos o mesmo script que antes if ($_SESSION["autenticado"] != "SI") { //se no estiver logado o envio pgina de autenticao header("Location: index.php"); } else { //seno, 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 sesso header("Location: index.php"); //envio o usurio pag. de autenticao //seno, atualizo a data da sesso }else { $_SESSION["ultimoAcesso"] = $agora; } } ?> Bibliografia:
http://www.criarweb.com http://www.revistaphp.com.br http://www.numaboa.com/informatica

You might also like