Manual do PHP
Anterior |  | Próxima

# XCVI. 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.

# Requisitos

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ção durante 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_handler`define 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 Predefinidas

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