Qual é a diferença entre session_unset () e session_destroy () em PHP?

88

Da documentação do php.net :

session_destroy - destrói todos os dados registrados para uma sessão

session_unset - Libera todas as variáveis ​​de sessão

Minha pergunta de três partes é:

As duas funções parecem muito semelhantes.
Qual é realmente a diferença entre os dois?

Ambos parecem excluir todas as variáveis ​​registradas em uma sessão. Algum deles realmente destrói a própria sessão? Se não, como fazer isso (destruir a própria sessão).

É correto que nenhuma das duas funções exclui o cookie de sessão no cliente?

João
fonte

Respostas:

145

session_unsetapenas limpa a $_SESSIONvariável. É equivalente a fazer:

$_SESSION = array();

Portanto, isso afeta apenas a $_SESSIONinstância da variável local , mas não os dados da sessão no armazenamento da sessão.

Em contraste com isso, session_destroydestrói os dados da sessão armazenados no armazenamento da sessão (por exemplo, o arquivo da sessão no sistema de arquivos).

Tudo o resto permanece inalterado.

quiabo
fonte
@Gumbo Não há algum problema com o uso de session_unset () obsoleto agora? Eu verifiquei isso e não funcionou para mim.
Navneet
@hakre qual é o aviso?
GoTo
4
@GoTo: Esse session_unset foi usado para remover as variáveis ​​globais registradas como variáveis ​​de sessão como era comum no PHP 4. O uso dessa função a partir de hoje é anacrônico e desnecessário. A única razão pela qual ainda está no PHP é provavelmente a compatibilidade com versões anteriores e nada mais. Se você escrever um novo código, não deve usá-lo. Se você encontrá-lo dentro do código, deve removê-lo junto com as chamadas para session_register () e o resto das variáveis ​​de sessão do PHP 4 manipulando funções, a menos que você esteja lidando explicitamente com o código do PHP 4.
hakre de
5
Ainda assim, é confuso: descreva local $_SESSION variable instance vs session data in the session storage. Como eu sei, existem 1000 pessoas como eu que não entenderam o seu ponto. Obrigado
Pratik
1
Sua resposta é muito confusa. Por favor, considere editá-lo, porque eu ainda acho que ambos estão destruindo a sessão
Pratik
17

session_destroy(); está excluindo toda a sessão.

session_unset();apaga apenas as variáveis ​​da sessão - a sessão ainda existe. Apenas os dados são truncados.

Xamael
fonte
15
session_unset();

Limpe todos os dados de todas as variáveis ​​de sessão.


session_destroy();

Remova todas as sessões.


Exemplo :

session_start();
session_destroy();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]é NULL.


session_start();
session_unset();     
$a = "1234";
$_SESSION[a] = $a;

$_SESSION[a]é 1234.


Então, vou usar:

session_start();
session_destroy();   
session_start();  
$a = "1234";
$_SESSION[a] = $a;
SLyHuy
fonte
2
no seu exemplo do meio -> session_unset();você NÃO está fazendo nada, pois ainda pode usar a sessão de $_SESSION["a"] , então para que serve?
Pratik
1
$_SESSION[a]deve ser $_SESSION['a'] e ao contrário do que você disse, NÃO é NULO em seu primeiro exemplo
Istiaque Ahmed
6

session_unset()irá limpar a $_SESSIONvariável (como em array()), mas não afetará o arquivo da sessão. Mas quando o script termina; o estado do $_SESSIONserá gravado no arquivo. Em seguida, ele limpará o arquivo, mas não o excluirá. Quando você o usa session_destroy(), não vai tocar em $_SESSION(Usar var_dump($_SESSION)depois session_destroy()), mas vai deletar o arquivo da sessão, então quando o script sair não haverá um arquivo para escrever o estado do $_SESSION.

Kaushik
fonte
1

Eu tentei usar o session_unset($_SESSION['session_name'])pensamento de que só removerá o nome de sessão específica ou individual / única. Mas o uso session_unset($_SESSION['session_name'])irá apenas remover a definição de todos os nomes de sessão. O código certo a ser usado é apenas unset($_SESSION['session_name'])se você deseja cancelar a definição de um único nome de sessão.

Marvin
fonte
0

session_destroy()irá excluir a sessão após mover a página e session_unset()irá excluir a sessão quando o código for executado.

Radian Yusuf Mahendra
fonte
0

session_start (); # criará um array virtual (associativo) na memória em tempo real do navegador

dois itens adicionados

> $_SESSION['me'] = "Yadab";  
> $_SESSION['you'] = "Avi";
>
> print_r($_SESSION); #will give, array( "me"=>"Yadab", "you"=>"Avi" )

test1

> unset($_SESSION['me']); #only 'me' variable is removed fully (index & value) 
> print_r($_SESSION); #now the array is Array("you"=>"Avi")

test2

> session_destroy(); #will unset the values of all session variables, but indexes exists 
> print_r($_SESSION); #Output, Array("you"=>undefined)
> #but some browser can store the value in cookies

test3

> session_unset(); #will unset all the main variables not only the values 
> print_r($_SESSION); #that means session array is now empty, like Array()

teste o bloco 1, 2 ou 3 individualmente, comentando os outros

Yadab Sd
fonte
-2

Acho que session_destroy () e session_unset () devem ser usados ​​ao mesmo tempo para garantir que os dados da sessão sejam apagados.

Riaj Mahmud Rasel
fonte
Acho que significa que você não tem certeza sobre a resposta. Isso deve ser um comentário, não uma resposta.
Shaiful Islam
4
session_unset()depois session_destroy()seria inútil. Use session_unset()para limpar todas as chaves e valores da superglobal $ _SESSION ou use session_destroy()para excluir a sessão inteira; não use ambos apenas para "ter certeza", confie na função para fazer seu trabalho.
redburn
@redburn session_destroy()não remove a variável superglobal da sessão até sair da página atual.
Yousha Aleayoub