7

mardi 24 mars 2015

[PHP] $_SESSION = array(), session_unset et session_destroy()

[MiniArticle] Aidant de temps en temps sur des forums ou en IRC, je tombe par moment sur des personnes qui mélangent, confondes et font des mélimélo perso. Mais pas seulement, il arrive que ce soit les "helpers" qui induisent en erreur (et là, c'est le drame) ...



Dans ce post nous allons parler des sessions avec PHP et plus particulièrement de leurs destruction.

Croisé sur le net :
  1. session_unset() ne doit pas étre utilisé car il détruira également la super globale $_SESSION qui deviendra inutilisable.
  2. On doit utiliser $_SESSION = array() puis session_unset() avant de "destroy"
  3. Il est inutile de vider $_SESSION si on fait un session_destroy()
  4. $_SESSION = array() et session_unset() font exactement la même chose
Alors que :
  1. Bien sur c'est faux. session_unset va entre autre vider $_SESSION, en revanche si l'on indique session_unset($_SESSION) on rigole jaune. C'est au passage indiqué sur le man de PHP ...
  2. Encore une idée étrange. Les deux vont faire une chose, c'est vider $_SESSION. Alors hors idée perverse d'utiliser le double de ressources c'est pas utile.
  3. session_destroy() vas détruire le fichier de session, mais ne vide pas la mémoire. On peut donc toujours accéder aux données.
  4. C'est pas si faux que ça et en vulgarisation c'est le cas. La seul différence est que session_unset(), va vérifier si ce qui est passé en arguments correspond bien à une "php_session_active".
Les exemples et sources :
Je vois déjà des "c'est bien beau, mais comment on peut savoir si toi aussi tu racontes pas des conneries ?"

Pour le 1er et 2eme points il est simple de vérifier : http://php.net/manual/fr/function.session-unset.php

Pour le 2eme point on peut tout de même vérifier :
<?php
session_start();
$_SESSION['time'] = time();
session_unset();
var_dump($_SESSION);
$_SESSION = array();
var_dump($_SESSION);

Le 3eme points est très simple à tester :
<?php
session_start();

$_SESSION['time'] = time();
$a = &$_SESSION;

session_destroy();
var_dump($a);

Le 4eme points ce trouve dans la source de php :
static PHP_FUNCTION(session_unset)
{
    if (PS(session_status) != php_session_active)
    {
        RETURN_FALSE;
    }

    IF_SESSION_VARS() 
    {
        HashTable *ht_sess_var = Z_ARRVAL_P(Z_REFVAL(PS(http_session_vars)));

        /* Clean $_SESSION. *
        zend_hash_clean(ht_sess_var);
    }
}

Petite Astuce : Pour vraiment faire le ménage de la session ajoutez setcookie(session_name(),'',0,'/'); ce qui supprime le cookie utilisateur de sa session terminée.


éa, les amis.

Aucun commentaire:

Enregistrer un commentaire