Manual do PHP
Anterior |  | Próxima

# CXI. Sessões

# Introdução

Suporte a sessões no PHP consiste em uma forma de preservar certos dados através de acessos subseqüentes. Isto te permite construir aplicações mais personalizadas e aumenta a atração ao seu web site.

Se você está familiarizado com o gerenciamento de sessões do PHPLIB, você irá notar que alguns conceitos são similares ao suporte de sessões do PHP.

Um visitante acessando seu web site está determinado por uma única id, a então chamada id de sessão. Esta ou é guardada em um cookie do lado do usuário ou está na URL.

Sessões te permite registrar arbitrariamente números de variáveis para estarem lado a lado com os requerimentos. Quando um visitante acessa seu site, o PHP checará automaticamente (se session.auto_start está definida para 1) ou no seu pedido (explicitamente através da session_start() ou implicitamente através da session_register()) se uma id de sessão especifica foi enviada com o pedido. Se este é o caso, o ambiente anterior guardado é restaurado.

Todas as variáveis registradas são publicadas em série após o pedido terminar. Variáveis registradas que estão indefinidas estão marcadas como estando não definida. Num acesso subseqüente, estas não estarão definidas pelo módulo da sessão a menos que o usuário defina elas mais tarde.

> Nota: Manipulação de sessões foi adicionado no PHP 4.0.

# Dependências

Nenhuma biblioteca externa é necessária para compilar esta extensão.

# Instalação

Suporte a sessões esta habilitado no PHP 4.0 por definição. Se você não gostaria de seu PHP com suporte a sessão, você especifica a opção de configuração --disable-session.

# Configurações em execução

O sistema de suporte de sessão oferece no arquivo `php.ini` numerosas opções de configuração. nós daremos um breve resumo.

- session.save_handlerdefine o nome do operador(funções-handler) que é usado para guardar e resgatar dados associados com a sessão. Por definição files.

- session.save_path define o argumento que que é passado para o save handler. Se você escolher o default files handler, este é o caminho onde os arquivos serão criados. Por definição para /tmp. Se a profundidade do caminho de session.save_path é maior do que 2, coleção de lixo não será executada(garbage collection - gc).

  Atenção
  Se você deixar isto definido para um diretório muito visível, tal como `/tmp` (o padrão), outros usuários do servidor poderão ser capazes de assumir o controle da sessão obtendo a lista de arquivos naquele diretório.

- session.name especifica o nome da sessão que é usada como nome de cookie. Ela poderia apenas conter caracteres alfanuméricos. Por definição PHPSESSID.

- session.auto_start especifica se o módulo da sessão inicia a sessão automaticamente num pedido na inicialização. Por definição 0 (desabilitado).

- session.cookie_lifetime especifica o tempo de vida de um cookie em segundos que é enviado para o navegador. O valor 0 significa "até que o navegador seja fechado." Por definição 0.

- session.serialize_handler define o nome do operador(handler) que é usado para serializar/deserializar dados. Correntemente, um formato interno do PHP (nome php) e WDDX é suportado (nome wddx). WDDX está apenas disponível, se o PHP está compilado com o suporteWDDX support. Por definição php.

- session.gc_probability especifica a probabilidade que a rotina gc (coleção de lixo-garbage collection) é iniciada em cada pedido em porcentagem. Por definição 1.

- session.gc_maxlifetime especifica o número de segundos depois que o dado será visto como 'lixo' e limpado.

- session.referer_check contém a substring que você quer checar cada HTTP Referer para. Se o Referer foi enviado pelo cliente e a substring não foi encontrada, a id de sessão embutida será percebida como inválida. Por definição uma string vazia.

- session.entropy_file dá um caminho para um recurso externo(file) que será usado como um entropy source na criação da id de sessão. São exemplos /dev/random ou /dev/urandom que estão disponéveis em muitos Sistemas Unix.

- session.entropy_length especifíca o número de bytes que serão lidos do arquivo especificado acima. Por definição 0 (desabilitada).

- session.use_cookies especifica se o módulo usará cookies para gravar a id de sessão no lado do cliente. Por definição 1 (habilitada).

- session.use_only_cookies especifica se o módulo usaráapenas cookies para gravar a id de sessão no lado do cliente. Por definição 0 (desabilitada). Habilitar esta definição previni ataques envolvendo id de sessão passadas em URLs. Esta definição foi adicionada no PHP 4.3.0.

- session.cookie_path especifica o caminho para definir em session_cookie. Por definição /.

- session.cookie_domain especifica o domínio para para definir em session_cookie. Nenhuma definição.

- session.cache_limiter especifica o método de controle do cache para usar para páginas de sessão (none/nocache/private/private_no_expire/public). Por definição nocache.

- session.cache_expire especifica o tempo de vida para páginas de sessão no cache em minutos, isto não tem efeito para para limitador sem cache. Por definição 180.

- session.use_trans_sid se o suporte de sid transparente está habilitado ou não, se habilitado por compilação com --enable-trans-sid. Por definição 1 (habilitado).

- url_rewriter.tags especifica quais tags html estão reescritas para incluir id de sessão se o suporte transparente de sid está habilitado. Por definição a=href,area=href,frame=src,input=src,form=fakeentry

A configuração de track_vars e register_globals influencia em como as variáveis da sessão conseguem armazenar e devolver.

> Nota: No PHP 4.0.3, track_vars está sempre ligada.

# Tipos Resource

Esta extensão não possui nenhum tipo resource.

# Constantes pré-definidas

As contantes abaixo são definidas por esta extensão e somente estarão disponíveis quando a extensão foi compilada com o PHP ou carregada dinamicamente durante a execução.

`SID` (string)

  Constantes contendo o nome da sessão e o ID da sessão na forma de "name=ID" ou uma string vazia no caso de o ID não tenha sido apropriadamente salvo em um cookie de seção.

# Exemplos

> Nota: No PHP 4.1.0, $_SESSION está disponível como variável global apenas como $_POST, $_GET, $_REQUEST e assim por diante. Não como $HTTP_SESSION_VARS, $_SESSION está sempre global. Então, global poderia não ser usada para $_SESSION.

Se track_vars is habilitada e register_globals está desabilitada, apenas aquelas membros da matriz associativa $HTTP_SESSION_VARS podem ser registradas em uma sessão de variáveis. A sessão de variáveis restauradas somente estarão disponíveis na matriz $HTTP_SESSION_VARS.

Exemplo 1. Registrando uma variável com track_vars habilitada

`<?php session_start(); if (isset($HTTP_SESSION_VARS['count'])) { $HTTP_SESSION_VARS['count']++; } else { $HTTP_SESSION_VARS['count'] = 0; } ?>`

Uso de $_SESSION (ou $HTTP_SESSION_VARS com PHP 4.0.6 ou inferior) é recomendado por segurança e code readablity. Com $_SESSION ou $HTTP_SESSION_VARS, não á necessidade de usar as funções session_register()/session_unregister()/session_is_registered(). Usuários podem acessar variável de sessão como uma variável normal.

Exemplo 2. Registrando uma variável com $_SESSION.

`<?php session_start(); // Use $HTTP_SESSION_VARS with PHP 4.0.6 or less if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } else { $_SESSION['count']++; } ?>`

Exemplo 3. Desregistrando uma variável com $_SESSION.

`<?php session_start(); // Use $HTTP_SESSION_VARS with PHP 4.0.6 or less unset($_SESSION['count']); ?>`

Se a register_globals está habilitada, então todas as variáveis globais podem ser registradas como variáveis de sessão e as variáveis de sessão serão restauradas para a variável global correspondente. Visto que o PHP deve saber quais variáveis globais estão registradas como variáveis de sessão, usuaários devem registrar variáveis com a função session_register() enquanto $HTTP_SESSION_VARS/$_SESSION não necessita utilizar session_register().

Cuidado

Se você está usando $HTTP_SESSION_VARS/$_SESSION e desabilitada register_globals, não faça uso de session_register(), session_is_registered() e session_unregister().

Se você habilita register_globals, session_unregister() poderiam ser usadas desde que as variáveis de sessão estejam registradas como variáveis globais quando os dados da sessão não estão em série. Desabilitar register_globals é recomendado para ambas razões, segurança e performance.

Exemplo 4. Registrando uma variável com register_globals habilitada

`<?php if (!session_is_registered('count')) { session_register("count"); $count = 0; } else { $count++; } ?>`

Se ambas track_vars e register_globals estão habilitadas, então as variáveis globais e as entradas $HTTP_SESSION_VARS/$_SESSION farão referência ao mesmo valor para as variáveis já registradas.

Se o usuário utiliza session_register() para registrar variável de sessão, $HTTP_SESSION_VARS/$_SESSION não terão esta variável numa matriz até que ela seja lida de um armazém de sessão. (i.e. até o próximo pedido)

# Passando a ID de sessão

Há dois métodos para propagar uma id de sessão:

- Cookies

- Parâmetro URL

Módulo de sessão suporta ambos os métodos. Cookies são mais eficientes, mas se eles não estiverem autorizados (clientes não são obrigados a aceita-los), nós não podemos conter deles. O segundo método inclui a id de sessão diretamente na URL.

PHP é capaz de fazer isto transparentemente quando compilado com --enable-trans-sid. Se você habilitar esta opção, URIs ligadas serão automaticamente mudadas para conter a id de sessão. Alternativamente, você pode usar a constante SID que é definida, se o cliente não enviar o cookie apropriado. SID é do formulário session_name=session_id ou é uma string vazia.

> Nota: A diretriz arg_separator.output `php.ini` permite personalizar o argumento separador.

O seguinte exemplo demonstra como registrar uma variável, e e como ligar corretamente a outra página usando SID.

Exemplo 5. Contar o número de visitas de um simples usuário

`<?php
if (!session_is_registered('count')) {
session_register('count');
$count = 1;
}
else {
$count++;
}
?>
Hello visitor, you have seen this page <?php echo $count; ?> times.<p>;
<?php
# the <?php echo SID?> (<?=SID?> can be used if short tag is enabled)
# is necessary to preserve the session id
# in the case that the user has disabled cookies
?>
To continue, <A HREF="nextpage.php?<?php echo SID?>">click here</A>`

A <?=SID?> não é necessário, se --enable-trans-sid foi usada para compilar o PHP.

> Nota: URLs não ligadas estão assumidas para apontar para sites externos e portanto não anexam a SID, pois ela poderia escapar para outro servidor.

# Session handlers customizáveis

Para implementar o armazenamento num banco de dados, ou qualque outra forma de aramzenamento, você vai precisar usar session_set_save_handler()* para define as funções de armazenamento que são usadas (* to create a set of user-level storage functions).

Anterior | Principal | Próxima
sesam_settransaction | Acima | session_cache_expire