Alors je vais vous en dire un peu plus 

Tout d'abord, (une partie de) ce que fait le regenerate_id. Elle ne se contente pas de faire un session_start mais elle fait également un session_destroy
1 2 3 4 5
|
$temp=$_SESSION;
session_destroy();
session_start();
$_SESSION=$temp; |
Pour le contexte et mes besoin, il s'agit de la gestion d'un panier. Dans ce dernier, l'internaute peut uploader des fichiers en rapport avec sa commande.
Tant que le panier n'est pas finalisé (payé) les fichiers restent sur le serveur en tant que "panier temporaire". Ils deviennent définitifs lorsque le panier est payé
En cas d'abandon de panier et surtout d'expiration/destruction de session, il ne faut pas se contenter de supprimer les données de session. S'il reste à ce moment des fichiers de "panier temporaire", il faut inclure leur suppression dans le garbage collector. Sinon on aurait des orphelin fichiers qui s'accumulent. Orphelins car ils ne sont plus associés à rien. Ni un panier finalisé, ni un panier en cours de creation.
Cette partie est faite, j'ai réécrit le gestionnaire de session pour que le GC appelle la fonction destroy et que la fonction destroy fasse le menage dans les fichiers lorqu'elle supprime une session. Tout est ok et tout fonctionne 
Le probleme est le regenerate_id. En effet, lorsque l'internaute s'identifie à son compte client, je lance un regenerate_id, afin d'éviter les vols de session.
Comme ce dernier fait un destroy sur la session en cours avant d'en creer une nouvelle, les fichiers uploadés par l'internaute sont supprimés.
D'où mon problème 
Si je n'ai pas réussi à être clair, n'hésitez pas à me demander plus de détails.
En fait, depuis hier soir j'ai fini par trouver une solution qui fonctionne mais ne me semble pas optimale.
Voici ce que j'ai fait. Dans ma fonction personnalisée destroy, je mets un parametre $cleanFiles que je place par défaut à false
function sessionDestroy($cleanFiles=false) {
Ainsi, par défaut mon destroy ne supprime pas les fichiers uploadés. Lorsque le regenerate_id se lance, je ne perds pas mes fichiers.
Par contre dans ma fonction gc personnalisées, j'appelle sessionDestroy avec cleanFiles à true
Ainsi, lors de l'expiration de la session, le ménage a bien lieu 
Qu'en pensez vous ?
Partager