Quelle est la différence entre session_unset () et session_destroy () en PHP?

88

Depuis la documentation php.net :

session_destroy - Détruit toutes les données enregistrées dans une session

session_unset - Libère toutes les variables de session

Ma question en trois parties est:

Les deux fonctions semblent très similaires.
Quelle est vraiment la différence entre les deux?

Les deux semblent supprimer toutes les variables enregistrées dans une session. L'un d'entre eux détruit-il réellement la session elle-même? Sinon, comment y parvenir (détruire la session elle-même).

Est-il correct qu'aucune des deux fonctions ne supprime le cookie de session chez le client?

Johan
la source

Réponses:

144

session_unsetefface simplement la $_SESSIONvariable. C'est équivalent à faire:

$_SESSION = array();

Cela n'affecte donc que l' $_SESSIONinstance de variable locale mais pas les données de session dans le stockage de session.

Contrairement à cela, session_destroydétruit les données de session qui sont stockées dans le stockage de session (par exemple le fichier de session dans le système de fichiers).

Tout le reste reste inchangé.

Gombo
la source
@Gumbo N'y a-t-il pas un problème avec session_unset () maintenant obsolète? J'ai vérifié cela et cela n'a pas fonctionné pour moi.
Navneet
@hakre quel est l'avertissement?
GoTo le
4
@GoTo: Cette session_unset a été utilisée pour annuler la définition des variables globales enregistrées en tant que variables de session comme cela était courant en PHP 4. L'utilisation de cette fonction à partir d'aujourd'hui est anachronique et n'est pas nécessaire. La seule raison pour laquelle il est toujours en PHP est probablement la rétrocompatibilité et rien d'autre. Si vous écrivez un nouveau code, vous ne devez pas l'utiliser. Si vous le trouvez dans le code, vous devez le supprimer avec les appels à session_register () et le reste des fonctions de gestion des variables de session PHP 4 à moins que vous ne traitiez explicitement du code PHP 4.
hakre
5
Pourtant, il est déroutant: veuillez décrire local $_SESSION variable instance vs session data in the session storage. Comme je sais, il y a 1000 personnes comme moi qui n'ont pas compris votre point. Merci
Pratik
1
Votre réponse est trop confuse. Veuillez envisager de le modifier, car je pense toujours que les deux sont en
train de
17

session_destroy(); supprime toute la session.

session_unset();supprime uniquement les variables de la session - la session existe toujours. Seules les données sont tronquées.

Xamael
la source
15
session_unset();

Effacez simplement toutes les données de toutes les variables de session.


session_destroy();

Supprimer toute la session.


Exemple :

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

$_SESSION[a]est NULL.


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

$_SESSION[a]est 1234.


Donc, je vais utiliser:

session_start();
session_destroy();   
session_start();  
$a = "1234";
$_SESSION[a] = $a;
SLyHuy
la source
2
dans votre exemple du milieu -> session_unset();vous ne faites rien car vous pouvez toujours utiliser session of $_SESSION["a"] , alors à quoi sert-il?
Pratik
1
$_SESSION[a]devrait être $_SESSION['a'] et contrairement à ce que vous avez dit ce n'est PAS NULL dans votre premier exemple
Istiaque Ahmed
5

session_unset()effacera la $_SESSIONvariable (comme dans array()), mais ne touchera pas le fichier de session. Mais quand le script se termine; l'état du $_SESSIONsera écrit dans le fichier. Ensuite, il effacera le fichier mais ne le supprimera pas. Lorsque vous l'utilisez, session_destroy()il ne touchera pas $_SESSION(Utiliser var_dump($_SESSION)après session_destroy()), mais supprimera le fichier de session, donc lorsque le script se terminera, il n'y aura pas de fichier pour écrire l'état du $_SESSION.

kaushik
la source
0

session_destroy()supprimera la session après avoir déplacé la page et session_unset()supprimera la session lorsque le code sera exécuté.

Radian Yusuf Mahendra
la source
0

J'ai essayé d'utiliser en session_unset($_SESSION['session_name'])pensant qu'il ne définira qu'un nom de session spécifique ou individuel / unique. Mais utiliser session_unset($_SESSION['session_name'])ne fera que désactiver tous les noms de session. Le bon code à utiliser est uniquement unset($_SESSION['session_name'])si vous souhaitez désactiver un seul nom de session.

Marvin
la source
0

session_start (); # il créera un tableau virtuel (associatif) dans la mémoire en temps réel du navigateur

deux éléments ajoutés

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

tester le bloc 1, 2 ou 3 individuellement en commentant les autres

Yadab Sd
la source
-2

Je pense que session_destroy () et session_unset () devraient être utilisés en même temps pour s'assurer que les données de session sont sûrement supprimées.

Riaj Mahmud Rasel
la source
Je pense que cela signifie que vous n'êtes pas sûr de la réponse. Cela devrait être un commentaire et non une réponse.
Shaiful Islam
4
session_unset()après session_destroy()serait inutile. Utilisez session_unset()pour effacer toutes les clés et valeurs de la superglobale $ _SESSION, ou utilisez session_destroy()pour supprimer toute la session; n'utilisez pas les deux juste pour "vous assurer", faites confiance à la fonction pour faire son travail.
redburn
@redburn session_destroy()ne désactive pas la variable superglobal sess avant de quitter la page actuelle.
Yousha Aleayoub