Uso básico

Sessões são uma forma simples de armazenar dados para usuários individuais usando um ID de sessão único. Sessões podem ser usadas para persistir informações entre requisições de páginas. IDs de sessão normalmente são enviados ao navegador através de cookies de sessão e o ID é usado para recuperar dados da sessão existente. A ausência de um ID ou cookie de sessão permite que o PHP saiba que deve criar uma nova sessão e gerar um novo ID de sessão.

Sessões seguem um fluxo simples. Quando uma sessão é iniciada, o PHP recupera uma sessão existente usando o ID informado (normalmente de um cookie de sessão) ou se nenhum é informado então será criada uma nova sessão. O PHP preencherá a super global $_SESSION com todos os dados de sessão depois que a sessão iniciar. Quando o PHP finalizar, automaticamente ele pegará o conteúdo da super global $_SESSION, então vai serializá-lo e enviá-lo para armazenamento usando o manipulador de gravação da sessão.

Por padrão, o PHP usa o manipulador de gravação interno files que é configurado por session.save_handler. Isto salva os dados da sessão no servidor no local configurado pela diretiva de configuração session.save_path.

Sessões podem ser iniciadas manualmente usando a função session_start(). Se a diretiva session.auto_start estiver configurada como 1, a sessão será iniciada automaticamente no início da requisição.

Sessões normalmente se encerram automaticamente quando o PHP termina de executar um script, mas podem ser encerradas manualmente usando a função session_write_close().

Exemplo #1 Registrando uma variável com $_SESSION.

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

Exemplo #2 Desregistrando uma variável com $_SESSION.

<?php
session_start
();
unset(
$_SESSION['count']);
?>

Cuidado

NÃO desregistre toda a $_SESSION com unset($_SESSION) já que isso desativará o registro de variáveis de sessões da super global $_SESSION.

Aviso

Referências não podem ser usadas nas variáveis de sessão já que não existe uma maneira de restaurar uma referência para outra variável.

Aviso

register_globals sobrescreverá as variáveis no escopo global que compartilham o mesmo nome com as variáveis de sessão. Por favor veja Usando a diretiva Register Globals para detalhes.

Nota:

Sessões baseadas em arquivos (padrão no PHP) adicionam travas no arquivo de sessão assim que a sessão é iniciada via session_start() ou simplesmente via session.auto_start. Assim que adicionada a trava, nenhum outro script pode acessar o mesmo arquivo de sessão até que ela seja finalizada pelo encerramento do primeiro script ou pela chamada de session_write_close().

Isto é possivelmente um problema para web sites que utilizam fortemente o AJAX e que tem múltiplas solicitações concorrentes. A maneira mais fácil de lidar com isto é chamar session_write_close() assim que as alterações necessárias na sessão forem feitas, de preferência no início do script. Como alternativa, um manipulador de sessão diferente que suporte concorrência poderia ser usado.

add a note add a note

User Contributed Notes 5 notes

up
30
AlexFBP
3 years ago
Regardless, if you need to set the header 'Location:' before closing the session; explicitly close the php script with "exit()" or "die()" functions. Remember that when a php script ends, the session automatically are going to be closed.
up
-13
v888666 at 126 dot com
1 year ago
as metioned in 5th paragraph:
"Sessions normally shutdown automatically when PHP is finished executing a script, but can be manually shutdown using the session_write_close() function."

It's important to note that , "session shutdown " and "session invalid" are not equivalant. when a session shutdown, its session file is still valid in 24min by default (session file still exists in session path) .
In subsquent access to this site ( ensure that this session file still exists ) ,this session will be resumed by session_start().
up
-26
guy at syntheticwebapps dot com
3 years ago
Despite the warning about not being able to use references inside the session space, I've done it in the past and apparently completely successfully. That is, I can do something like this:

<?php
session_start
();
if (!
$_SESSION['favorite']) {
   
$_SESSION['cow'] = "Elsie";
   
$_SESSION['favorite'] =& $_SESSION['cow'];
    echo
"We set cow = '$_SESSION[cow]' and favorite =& cow ($_SESSION[favorite]).<br/>Reload the page to see if both change when one changes later.<br/>";
} else {
    echo
"Having re-entered the session after initial settings were made: cow = $_SESSION[cow] and favorite = $_SESSION[favorite].<br/>";
   
$_SESSION['cow'] = "Bessie";
    echo
"We reassigned cow = $_SESSION[cow] and our restored reference variable favorite = $_SESSION[favorite]<br/>Note the presence of the &s in the var_dump below.<pre>";
   
var_dump($_SESSION);
    echo
"</pre><br/>If you reload, the test will begin again.";
    unset(
$_SESSION['cow'], $_SESSION['favorite']);
   
session_destroy();
}
?>
yields the following after the second request:

Having re-entered the session after initial settings were made: cow = Elsie and favorite = Elsie.
We reassigned cow = Bessie and our restored reference variable favorite = Bessie
Note the presence of the &s in the var_dump below.
array(2) {
  ["cow"]=>
  &string(6) "Bessie"
  ["favorite"]=>
  &string(6) "Bessie"
}
If you reload, the test will begin again.

I've found this ability very useful and storage efficient in the session data.
up
-32
jpleveille at webgraphe dot com
4 years ago
As mentioned in the documentation, using session_write_close() shuts down the session. It is particularly useful if you want to use header('Location: SOMEURL'); to a URL within the same scope of the current script, that will load the session. Why?

When you use this header directive, the browser is requested to redirect the user to the given URL. If that URL is in the scope of the script where header() is called (let's say, same URL), the requested URL "COULD" load the session BEFORE it has actually been shut down in the previous script, and you might end up with the session from the previous request, reverting all modifications to session in the the last script.

<?php
session_start
();

if (!isset(
$_SESSION['hello']))
{
 
$_SESSION['hello'] = 'world';

 
session_write_close();
 
// session is now closed, it's safe to redirect
  // if not closed, $_SESSION['hello'] may not be set properly
  // when loading the page again
  // (in this very case, calls to this script could loop for a while)
 
header('Location: ' . $_SERVER['PHP_SELF']);
}
?>
up
-45
eddie at onefoldmedia dot com
2 years ago
If a session is not saving and you have verified that session_start() is being called, then double check capitalization. $_session can store variables but will not be treated like a session or cause an error.
To Top