Gerenciando sessão no PHP com Zend_Session

Posted on março 3, 2012. Filed under: PHP, Tips, Zend Framework | Tags:, , |

Introdução

Trabalhar com sessões no PHP, à primeira vista, normalmente é percebido como algo assustador, porém instigante e necessário. A utilização de sessões permite persistir dados dos usuários através de diferentes requisições. Todo o mecanismo para utilzação de sessões no PHP é de modo estruturado. O Zend Framework nos proporciona trabalhar com sessões no modo de programação orientado a objetos, abstraído da camada estruturada do php, principalmente através das classes Zend_Session e Zend_Session_Namespace.

O modo como o Zend Framework trabalha com sessões é bastante intuitivo, deixa o código mais organizado, fácil de utilizar, fácil de manter e pode ser usado fora da estrutura MVC. Abaixo, vamos à alguns exemplos práticos.

Criando dados na sessão

A criação de sessões é bem simples, ainda mais utilizando POO. Segue abaixo código que cria dados na sessão usando o Namespace padrão.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo o namespace padrao */
$session = new Zend_Session_Namespace();

/* inserir dados na sessao */
if(!isset($session->usuario)) {
        $session->usuario = 'Douglas';
        $session->email = 'douglas.pasqua@gmail.com';
        $session->apelido = 'Doug';
        $session->telefone = '(11) 9999-9999';
}

Acessando dados na sessão

Para acessar os dados da sessão criado no script anterior, não há segredos. Por enquanto, estamos trabalhando somente com o Namespace padrão.
Para que os dados sejam printados na tela corretamente, é necessário ter passado antes pelo script anterior, para que os dados possam ser criados.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo o namespace padrao */
$session = new Zend_Session_Namespace();

/* printando na tela os dados armazenados na sessao */
if(isset($session->usuario)) {
        echo $session->usuario . "<br />";
        echo $session->email . "<br />";
        echo $session->apelido . "<br />";
        echo $session->telefone . "<br />";
}

Ao navegar pelo script:

Caso precise limpar os dados armazenados anteriormente, de maneira simples:

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo o namespace padrao */
$session = new Zend_Session_Namespace();

/* limpando as informacoes do usuario da sessao padrao */
unset($session->usuario);

Segregando dados na sessão utilizando Namespaces

A utilização de Namespaces na sessão pelo ZF ajuda a evitar colisão de informações, além de deixar todo o processo mais limpo e organizado. Dessa forma, podemos ter um mesmo nome de variável na sessão, com dados diferentes, porém em namespaces diferentes.

Veja no código abaixo, que criamos dois namespaces de sessão, Login e Webservice. Dessa forma podemos manter informações diferentes para o mesmo nome de variável, usuario, sem que uma conflite com a outra.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo a sessao referente ao namespace Login */
$session_login = new Zend_Session_Namespace('Login');

/* obtendo a sessoa referente ao namespace Webservice */
$session_webservice = new Zend_Session_Namespace('Webservice');

/* incluindo dados na sessao do namespace Login */
if(!isset($session_login->usuario)) {
        $session_login->usuario = 'admin';
}

/* incluindo dados na sessao do namespace Webservice */
if(!isset($session_webservice->usuario)) {
        $session_webservice->usuario = 'visitante1';
}

Após navegar pelo script anterior, e ao acessar o próximo script, estaremos printando na tela as informações definidas nos Namespaces Login e Webservice.

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* obtendo a sessao referente ao namespace Login */
$session_login = new Zend_Session_Namespace('Login');
/* obtendo a sessoa referente ao namespace Webservice */
$session_webservice = new Zend_Session_Namespace('Webservice');

/* printando na tela os  dados da sessao do namespace Login */
if(isset($session_login->usuario)) {
        echo "Logado como: " . $session_login->usuario . "<br />";
}

/* printando na tela os  dados da sessao do namespace Webservice */
if(isset($session_webservice->usuario)) {
        echo "Usuario Webservice: " . $session_webservice->usuario . "<br />";
}

Limpando os dados da Sessão

Existem diversas formas de limpar os dados da sessão. Como sempre os módulos do ZF são bastante flexíveis. O script abaixo limpa os dados da sessão somente para o Namespace Webservice:

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* inicializando a sessao */
Zend_Session::start();

/* limpando todos os dados da sessao referente ao namespace Webservice */
if(Zend_Session::namespaceIsset("Webservice")) {
        Zend_Session::namespaceUnset("Webservice");
}

Caso queira deletar todas as informações que estão na sessão, incluíndo todos Namespaces:

<?php
/* include do Zend Session */
require_once ('Zend/Session/Namespace.php');

/* limpando todos os dados da sessao */
Zend_Session::destroy(true);

Fazendo a sessão persistir

Por padrão, ao criarmos uma sessão, ela irá persistir somente até você fechar o navegador. Caso você queira que a sessão perpetue-se além da sessão do navegador, você pode definir um tempo de expiração maior para sua sessão através do método rememberMe. Isso é útil por exemplo, caso deseje lembrar o nome do usuário toda vez que ele voltar no site, ou até mesmo salvar os dados de autenticação para mantê-lo logado sempre que voltar ao site.

No exemplo abaixo, ao passar por esse script, sua sessão será mantida por 1 mês. O método rememberMe recebe o parâmetro de tempo em segundos.

<?php
/* include Zend Session */
require_once ('Zend/Session/Namespace.php');

/* inicializando a sessao */
Zend_Session::start();

/* persistir a sessao por 1 mes */
Zend_Session::rememberMe(60 * 60 * 24 * 7 * 4);

Após usar o rememberMe, queria voltar que a sessão dure somente até fechar o navegador, você pode usar o método forgetMe().

Re-definindo o ID da Sessão

O controle da sessão de um usuário é identificado através de um ID único. Esse ID único é gerado pelo PHP e enviado para o usuário através de um cookie no navegador. Esse cookie é enviado para o servidor em todas requisições sub-sequentes para que possamos identificar o usuário novamente e obter seus dados correspondentes.

O php nos permite gerar esse ID novamente caso desejado. É interessante gerar esse ID novamente no momento que o usuário autentica no site. ajudando a evitar ataques que roubam sua sessão. Para se informar mais sobre segurança de sessão, acessar o link .

Segue abaixo exemplo caso queria re-definir o ID da sessão:

<?php
/* include Zend Session */
require_once ('Zend/Session/Namespace.php');

/* inicializa sessao */
Zend_Session::start();

/* obtem o id da sessao atual */
$id_antes = Zend_Session::getId();

/* re-define o id da sesssao */
Zend_Session::regenerateId(true);

/* printar na tela o antes e depois do re-definir o id da sessao */
echo "id da Sessao antes: " . $id_antes . "<br />";
echo "id da Sessao depois: " . Zend_Session::getId() . "<br />";

Ao Acessar o script anterior:

Conclusão

O Zend Framework fornece um série de APIs consistentes e flexíveis. É o que acontece com o Zend_Session. Biblioteca muito rica. Procurei apresentar o essencial dela neste artigo. Caso queira se aprofundar, acesse o manual através do link abaixo. Espero que tenham gostado e até a próxima.

http://framework.zend.com/manual/en/zend.session.html

Make a Comment

Deixe uma resposta para Marcio Cancelar resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

3 Respostas to “Gerenciando sessão no PHP com Zend_Session”

RSS Feed for Pasqua Tecnologia Comments RSS Feed

Parabéns bem simples e objetiva, me ajudou bastante, Obrigado!

Era o que eu estava precisando.

Ótimo arigo…
Parabéns JLNeto.

Muito bom, me ajudou muito. Valeu.


Where's The Comment Form?

Liked it here?
Why not try sites on the blogroll...

%d blogueiros gostam disto: