Jaka jest różnica między session_unset () i session_destroy () w PHP?

88

Z dokumentacji php.net :

session_destroy - niszczy wszystkie dane zarejestrowane w sesji

session_unset - zwolnij wszystkie zmienne sesji

Moje trzyczęściowe pytanie brzmi:

Te dwie funkcje wydają się bardzo podobne.
Jaka jest tak naprawdę różnica między nimi?

Oba wydają się usuwać wszystkie zmienne zarejestrowane w sesji. Czy któryś z nich faktycznie niszczy samą sesję? Jeśli nie, jak tego dokonasz (zniszcz samą sesję).

Czy to prawda, że ​​żadna z tych dwóch funkcji nie usuwa sesyjnego pliku cookie u klienta?

Johan
źródło

Odpowiedzi:

144

session_unsetpo prostu czyści $_SESSIONzmienną. Jest to równoważne wykonaniu:

$_SESSION = array();

Ma to więc wpływ tylko na $_SESSIONinstancję zmiennej lokalnej, ale nie na dane sesji w pamięci sesji.

W przeciwieństwie do tego, session_destroyniszczy dane sesji, które są przechowywane w pamięci sesji (np. Plik sesji w systemie plików).

Wszystko inne pozostaje niezmienione.

Gumbo
źródło
@Gumbo Czy nie ma teraz problemu z wycofywaniem session_unset ()? Sprawdziłem to i nie zadziałało.
Navneet
@hakre jakie jest ostrzeżenie?
GoTo
4
@GoTo: To session_unset było używane do usuwania ustawień zmiennych globalnych zarejestrowanych jako zmienne sesji, tak jak to było powszechne w PHP 4. Używanie tej funkcji na dzień dzisiejszy jest anachroniczne i nie jest konieczne. Jedynym powodem, dla którego nadal jest w PHP jest prawdopodobnie kompatybilność wsteczna i nic więcej. Jeśli piszesz nowy kod, nie powinieneś go używać. Jeśli znajdziesz go w kodzie, powinieneś go usunąć wraz z wywołaniami session_register () i resztą funkcji obsługujących zmienne sesyjne PHP 4, chyba że masz do czynienia z kodem PHP 4.
hakre
5
Nadal jest to zagmatwane: proszę opisać local $_SESSION variable instance vs session data in the session storage. Z tego co wiem, jest 1000 takich ludzi jak ja, którzy nie zrozumieli twojego zdania. Dzięki
Pratik
1
Twoja odpowiedź jest zbyt zagmatwana. Proszę rozważyć jego edycję, ponieważ nadal uważam, że oba niszczą sesję
Pratik
17

session_destroy(); usuwa całą sesję.

session_unset();usuwa tylko zmienne z sesji - sesja nadal istnieje. Obcinane są tylko dane.

Xamael
źródło
15
session_unset();

Po prostu wyczyść wszystkie dane ze wszystkich zmiennych sesji.


session_destroy();

Usuń całą sesję.


Przykład :

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

$_SESSION[a]jest NULL.


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

$_SESSION[a]jest 1234.


Więc użyję:

session_start();
session_destroy();   
session_start();  
$a = "1234";
$_SESSION[a] = $a;
SLyHuy
źródło
2
w twoim środkowym przykładzie -> session_unset();NIE robisz nic, ponieważ nadal możesz korzystać z sesji $_SESSION["a"] , więc po co z tego?
Pratik
1
$_SESSION[a]powinno być $_SESSION['a'] iw przeciwieństwie do tego, co powiedziałeś, NIE JEST NULL w twoim pierwszym przykładzie
Istiaque Ahmed
5

session_unset()wyczyści $_SESSIONzmienną (jak w array()), ale nie dotknie pliku sesji. Ale kiedy skrypt się kończy; stan $_SESSIONzostanie zapisany do pliku. Wtedy wyczyści plik, ale go nie usunie. Kiedy session_destroy()go użyjesz , nie dotknie $_SESSION(Użyj var_dump($_SESSION)po session_destroy()), ale usunie plik sesji, więc po zakończeniu działania skryptu nie będzie pliku do zapisania stanu $_SESSION.

kaushik
źródło
0

session_destroy()usunie sesję po przeniesieniu strony i session_unset()usunie sesję po uruchomieniu kodu.

Radian Yusuf Mahendra
źródło
0

Próbowałem użyć session_unset($_SESSION['session_name'])myślenia, że ​​spowoduje to tylko usunięcie konkretnej lub indywidualnej / pojedynczej nazwy sesji. Ale użycie session_unset($_SESSION['session_name'])spowoduje tylko usunięcie wszystkich nazw sesji. Prawidłowy kod do użycia to tylko unset($_SESSION['session_name'])wtedy, gdy chcesz usunąć nazwę pojedynczej sesji.

Marvin
źródło
0

session_start (); # utworzy wirtualną tablicę (asocjacyjną) w pamięci czasu rzeczywistego przeglądarki

dodano dwie pozycje

> $_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()

testuj blok 1, 2 lub 3 indywidualnie, komentując innych

Yadab Sd
źródło
-2

Myślę, że session_destroy () i session_unset () powinny być używane w tym samym czasie, aby upewnić się, że dane sesji zostały na pewno usunięte.

Riaj Mahmud Rasel
źródło
Myślę, że nie jesteś pewien odpowiedzi. To powinien być komentarz, a nie odpowiedź.
Shaiful Islam
4
session_unset()później session_destroy()byłoby bezcelowe. Służy session_unset()do usuwania wszystkich kluczy i wartości z superglobalnej tablicy $ _SESSION lub session_destroy()do usuwania całej sesji; nie używaj obu tylko do „upewnienia się”, ufaj funkcji, że wykonuje swoje zadanie.
redburn
@redburn session_destroy()nie wyłącza sess superglobal var aż do wyjścia z bieżącej strony.
Yousha Aleayoub