Page 1 sur 2

effacer les fichier de session...

Posté : 18 févr. 2007, 11:57
par BeRoots
Salut à tous :)

j'aimerai savoir comment je peut forcer l'effacement du fichier de session sur le server?

en fait voici ce que je fait et j'ai une erreur qui me dit que le parametre de session_destroy n'est pas correct :?
// on definit l'ancien id de session
$old_session = session_id();
// on remplace l'identifiant de session courant par un nouveau à chaque action
session_regenerate_id();
// on efface l'ancien fichier de session devenu obselete
session_destroy($old_session);
mon objectif est de supprimer les anciens fichiers de session après chaque session_regenerate()

Si quelqu'un à une idée à me proposé ;)

Merci d'avance.

Posté : 18 févr. 2007, 13:17
par BeRoots
mon probleme est qu'a chaque fois que je fais un session_regenerate(), un fichier du style sess_984bbb1594d3efe29457ebc722f03e47 est créé mais l'ancien reste dans le dossier cible des sessions.

je ne trouve rien dans la doc pour faire en sorte d'effacer l'ancien fichier :?

mon session.cache_expire est à 180 et mon session.cache_limiter est à nocache mais j'ai l'impression que ces fichier ne sont jamais effacer.

1°) 180, c'est bien en minute? (c'est pas dans la doc) :(
2°) si quelqu'un voit une solution pour effacer ces anciens fichiers de session

Posté : 18 févr. 2007, 14:14
par Ajoloca
Bonjour,

Fais une recherche sur le forum, ce sujet à déjà été traité avec des solutions.

Posté : 19 févr. 2007, 15:40
par BeRoots
désolé mais cela fait depuis hier que je cherche sur le forum pour trouver ce topic mais en vain :(

je pensai faire cela comme suit:
// on definit l'ancien id de session 
$old_session_id = session_id(); 
// on definit le nom de l'ancien fichier de session
$old_session_filename = "sess_$old_session_id";

// on remplace l'identifiant de session courant par un nouveau à chaque action 
session_regenerate_id(); 
// on efface l'ancien fichier de session devenu obselete 
opendir(session_save_path());
unlink(session_save_path().$old_session_filename);
closedir(opendir(session_save_path()));
le problème est que j'ai un message d'erreur comme suit:
Warning: unlink(URI_DU_DOSSIER/sess_sfh54uy2t1d5za3dfyt8mol9jeaz6gx5b): Permission denied in URL_DU_SCRIPT line 53
1°) est ce une bonne methode où y a t'il des solutions plus automatique de prevu pour php? (perso je prefererai que session.cache_expire fonctionne et que ça ce face tout seul)

2°) au cas où il n'y ai pas de meilleur methode, j'ai essayer de faire avec chmod() chown() et chgrp() mais toujour la même erreure. Si quelqu'un peut m'aider un peu ;)

merci d'avance :)

Posté : 19 févr. 2007, 15:45
par Ajoloca
Bonjour,

Regarde ici

Posté : 19 févr. 2007, 16:22
par BeRoots
re boujour :)

j'avait bien survole ce sujet mais je ne pense pas que mon problème vienne de là :-k

j'utilise uniquement session_unset() suivit de session_destroy() pour la deconnexion manuel du visiteur et j'efface mes variables de session inutile de page en page suivant le besoin de les garder ou non...

mon problème est que je retrouve des fichiers de session vieux de plusieur mois qui ne s'efface pas :?

pourtant le cookie est bien effacer à la fermeture du navigateur et mon session.cache_expire = 180 donc ces fichiers devraient êtres supprimé tous seul, nan?

je ne comprend vraiment pas pourquoi alors, je retrouve des fichier de session de 0 octet vieux de plus de 3 heures :?

Posté : 19 févr. 2007, 16:36
par zigz4g
Ce ne serait pas cette directive qui t'interesse ?
session.gc_maxlifetime
Je crois mais ce serait bien de reverifier, c'est le moteur de php qui supprime les fichiers de session.

Posté : 19 févr. 2007, 16:49
par BeRoots
Merci pour la proposition mais ca ne vient pas de là apparament :(
Mon session.gc_maxlifetime = 1440 (soit 24minutes)

donc pas de problème apparent de ce coté mais cela ne m'explique pas pourquoi le moteur de php ne fait pas le menage dans session_save_path()... :?

si quelqu'un à une idée sur le pourquoi du comment ;)

Posté : 19 févr. 2007, 17:15
par Ajoloca
Re,

Comment as-tu définie la directive session.save_path ?

Utilises-tu le second paramètre ?

Si c'est le cas, PHP ne détruit pas les fichiers. Tu dois le faire à la main (cron ou équivalent).

Posté : 19 févr. 2007, 17:34
par BeRoots
en fait je n'est rien defini du tous :?

chez mon hébergeur le php.ini est par default avec session.save_path = /home/www/moncompte/sessions pour local et master value.

chez moi en local via EasyPHP, c'est pareil sauf que session.save_path = C:\PROGRAM~1\EASYPH~1\\tmp\ pour local et master value.

je suppose que ce second paramètre et master value. C'est ça?

si c'est bien ça alors comment faire pour avoir la permission de supprimer le fichier? (cf mon message plus haut)

Posté : 19 févr. 2007, 17:42
par zigz4g
// on definit l'ancien id de session 
$old_session_id = session_id(); 
// on definit le nom de l'ancien fichier de session
$old_session_filename = "sess_$old_session_id";

// on remplace l'identifiant de session courant par un nouveau à chaque action 
session_regenerate_id(); 
// on efface l'ancien fichier de session devenu obselete 

//Tu devrais mieux recuperer la ressource retournee et de plus faire les IF necessaires.
$res_dir = opendir(session_save_path());
//Un petit :
//echo "Mon chemin = [", session_save_path().$old_session_filename, "]<br >";
//If pour verifier si le fichier est bien supprime.
unlink(session_save_path().$old_session_filename);

//J'aime pas trop cette methode de reouvrir pour fermer un filedescriptor.
//closedir(opendir(session_save_path()));
closedir($res_dir);
Si tu fais cela dans une classe et plus precisement dans le destructeur c'est le chemin complet qu'il faut donner.

Je vois pas d'autre idee sur le probleme.

Posté : 19 févr. 2007, 18:09
par BeRoots
ok merci, j'ai remis au propre:
// on definit l'ancien id de session
$old_session_id = session_id();
// on definit l'ancien nom de fichier de session
$old_session_filename = "sess_$old_session_id";
// on remplace l'identifiant de session courant par un nouveau à chaque action
session_regenerate_id();
// on supprime l'ancien fichier de session devenu obselete
$dossier_session = opendir(session_save_path());
echo "Mon chemin =[", session_save_path().$old_session_filename, "]<br />";
unlink(session_save_path().$old_session_filename);
closedir($dossier_session);
le echo me retourne bien le bon chemin pour le fichier ;)

1°) par contre comment puis-je savoir ce que me retourne la fonction unlink() (true ou false) afin de s'assurer que la suppression à bien été effectuée?

2°) Sinon, j'ai toujours le même warning de permission denied pour unlink()...

Si quelqu'un à une idée ;)

Posté : 19 févr. 2007, 18:19
par Ajoloca
Re,
Le second paramètre dont je te parle correspond à ceci
Il y a un argument optionnel N à cette directive qui détermine la profondeur de répertoires où votre fichier de session sera stocké. Par exemple, si vous définissez '5;/tmp', votre fichier sera situé dans /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If. Si vous voulez utiliser N, vous devez créer tous ces répertoires avant de les utiliser. Un petit script shell existe dans ext/session pour réaliser ces créations et il se nomme mod_files.sh. Notez également que si N est utilisé et est supérieur à 0, alors la routine automatique gc (garbage collection) ne sera pas exécutée ; voir une copie de php.ini pour plus d'informations. Également, si vous utilisez N, assurez-vous d'entourer session.save_path de "doubles guillemets" car le séparateur (;) est également utilisé pour les commentaires dans php.ini.
Mais il n'a pas l'air d'être défini.

Posté : 19 févr. 2007, 19:36
par BeRoots
donc le dossier contenant les fichiers de session devrai ce nettoyer tout seul :?

de plus en faisant comme ceci je rencontre de nouveau problème :(
// on definit l'ancien id de session
$old_session_id = session_id();
// on definit l'ancien nom de fichier de session
$old_session_filename = "sess_$old_session_id";
// on remplace l'identifiant de session courant par un nouveau à chaque action
session_regenerate_id();
// on supprime l'ancien fichier de session devenu obselete
$dossier_session = opendir(session_save_path());
echo "Mon chemin =[", session_save_path().$old_session_filename, "]<br />";
unlink(session_save_path().$old_session_filename);
closedir($dossier_session);
l'echo me retourne ceci sous easyphp (winXP):
Mon chemin =[C:\PROGRA~1\EASYPH~1\\tmp\sess_f0e4dd62803a189f9d2597e8e6b5e405]
et il ne retourne ceci en ligne (linux):
Mon chemin =[/home/www/moncompte/sessionssess_2f35b48cd0e79a0d5bbec3ceec303a3d]
noter que sous linux il manque le / ce qui génere une erreure... et que sous winXP le \ est bien là (pourtant mon php.ini contient session.save_path = /tmp)

Je pense donc que pour limité la casse et afin de pouvoir continuer à develloper sans devoir tout faire sous linux, il va falloir que je comprenne pourquoi le nettoyage auto du moteur de php ne fonctionne pas.

donc si quelqu'un voit pourquoi mon session.gc_maxlifetime n'est pas respecté? et donc pourquoi mes fichiers de session ne sont pas effacer tout seul après un certain temps?

Merci d'avance ;)

Posté : 19 févr. 2007, 22:36
par BeRoots
ok j'ai utilisé une petite suptilité pour ne pas avoir deux script different en local et en ligne et donc avoir le slash en plus pour linux :)

je vais donc continuer dans l'optique de nettoyer le dossier des fichiers de session "à la main".

je fait donc ainsi:
   // on definit l'ancien id de session
   $old_session_id = session_id();
   // on definit l'ancien nom de fichier de session
   $old_session_filename = "sess_$old_session_id";
   // on remplace l'identifiant de session courant par un nouveau à chaque action
   session_regenerate_id();
   // on supprime l'ancien fichier de session devenu obselete
   $dossier_session = opendir(session_save_path());
   $slash = ($_SERVER['SERVER_ADDR'] == '127.0.0.1') ? '' : '/'; // on definit le slash que pour version en ligne
   echo "Mon chemin =[", session_save_path().$slash.$old_session_filename, "]<br />";   
   unlink(session_save_path().$slash.$old_session_filename);
   closedir($dossier_session);
En ligne tout fonctionne nickel :D
Par contre en local via Easyphp, j'ai encore ce satané problème de permission que je n'arrive pas à résoudre :evil:
Warning: unlink(URI_DU_DOSSIER/sess_sfh54uy2t1d5za3dfyt8mol9jeaz6gx5b): Permission denied in URL_DU_SCRIPT line 53
Si quelqu'un voit une solution pour avoir tous les droits sur ces fichiers ;)