PHP et les sessions : utilisation avancée (2) Destruction de la session et garbage collector

La suppression des données de session peut être effectuée à deux moments : lors de sa destruction explicite (avec session_destroy()) ou au passage du garbage collector. Nous allons donc implémenter une méthode delete() qui supprimera une session, et qui sera appelée par destroy() et gc().

Se baser sur l'identifiant de session pour connaître les fichiers associés à une session

Dans cet exemple, on supposera que certaines données, stockées dans un répertoire data/sessions/[identifiant de session] sont d'autres données liées aux session que nous souhaitons supprimer.

On peut également imaginer devoir supprimer des données dans une base de données.

  1.     /**
  2.       * Suppression des données d'une session.
  3.       * @param string $id
  4.       * @return void
  5.       */
  6.     protected function delete($id)
  7.     {
  8.     unlink(self::$save_path.'/sess_'.$id);
  9.     // on suppose ici que le répertoire de session n'a pas de sous-répertoire.
 10.     $sess_dir = 'data/sessions/'.$id;
 11.     $to_delete = scandir($sess_dir);
 12.     foreach($to_delete as &$file)
 13.     {
 14.     if($file == '.' || $file == '..') continue;
 15.     unlink($sess_dir.'/'.$file);
 16.     }
 17.     rmdir($sess_dir);
 18.     }
 19.       
 20.     /**
 21.       * Destruction de la session.
 22.       * @param string $id
 23.       * @return bool
 24.       */
 25.     public static function destroy($id) {
 26.     self::delete($id);
 27.     }
 28.       
 29.     /**
 30.       * Ramasse-miettes
 31.       * @param int $maxlifetime
 32.       */
 33.     public static function gc($maxlifetime)
 34.     {
 35.     $toDelete = glob(self::$save_path.'/sess_*');
 36.     foreach($toDelete as &$id)
 37.     {
 38.     self::delete($id);
 39.     }
 40.     }

Attention à l'identifiant de session !

Dans notre exemple ci-dessus, on se base sur l'identifiant de session pour connaître les fichiers associés à une session. N'oubliez pas que cette pratique n'est pas nécessairement idéale, puisque par sécurité, cet identifiant risque d'être modifié !

Conclusions

Attention, cet article permet de comprendre quelques points importants, mais ne prétend naturellement être complet (on en est même loin !). N'oubliez pas de faire vos propres tests et de lire d'autres articles pour en savoir plus, et plus particulièrement sur la sécurité.