IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Détruire une variable de session au changement de page


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Points : 193
    Points
    193
    Par défaut Détruire une variable de session au changement de page
    Bonjour à tous,

    Je cherche un moyen de détruire des variables de session lorsque l'internaute quitte la page.

    Je m'explique un peu plus...Sur mon site, je propose un formulaire ou les internautes peuvent insérer des photos par le biais de champ type file. Je propose également la possibilité de les pré-visualiser avant d'enregistrer totalement les informations du formulaire. Pour ce faire, je stock les images dans un dossier de manière temporaire sur mon ftp et je stock les noms des images dans des variables de session.

    Dans la mesure ou l'internaute va jusqu'au bout de la procédure et valide l'enregistrement du formulaire, la pas de problème, je bascule les images du dossier temporaire au dossier définitif et je détruis les variables de session contenant le nom des images.

    Mais si l'internaute ne va pas jusqu'au bout et au lieu de valider le formulaire, il s'en va sur une autre page du site, je me retrouve avec le nom des images contenu dans les variables de session toujours active et en plus les images ne sont pas effacer du fichier temporaire, c'est plutôt gênant.

    Je sais que je peux faire ça avec ajax mais je souhaite éviter de trop utiliser javascript dans la mesure ou l'internaute le désactive, tout au moins pour cette partie, afin de ne pas me retrouver dans 6 mois avec un certain nombre d'images qui servent à rien et qui prennent du poids dans mon dossier temporaire.

    Merci à tous pour vos réponses.

  2. #2
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    Salut, concernant ta session qui reste active, ce n'est pas un problème, elle sera détruite automatiquement au bout de plusieurs minutes.
    Concernant ton fichier, s'il est dans le répertoire des fichiers temporaires, il sera également supprimé automatiquement en fonction de la politique de ton serveur.

    A+

  3. #3
    Membre habitué Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Points : 193
    Points
    193
    Par défaut
    Merci Arnolem pour ta réponse,

    Elle est intéressante puisque je n'avais pas pensé à utiliser la variable $_FILES['tmp_name']['X'] pour afficher sur mon site une prévisualisation.

    Mais si j'ai bien compris ta réponse, ça ne peut pas convenir pour mon cas, puisque que les images passe par une fonction GD pour les transformer en vignette et aussi les retailler. Dans ma prévisualisation j'ai développer un système en action script3 qui importe les images et qui les lis sous forme de diaporama.

    Par conséquent les images sont toutes traitées puis enregistrer dans un fichier sur mon FTP. Ce qui me permet par la suite de pas avoir à retravailler les images puisqu'elles sont enregistrées optimisées en terme de dimension et de poids.

    De plus je ne souhaite pas attendre que les sessions se détruise d'elles mêmes. Dans le cas présent si l'internaute charge une prévisualisation des photos et qu'il s'en va. Si il revient, la prévisualisation et toujours en mémoire et affichée.

  4. #4
    Rédacteur

    Avatar de arnolem
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 856
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 856
    Points : 6 114
    Points
    6 114
    Par défaut
    Comment définie tu qu'un internaute quitte ton site ?
    C'est une notion qui n'existe pas en Web

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    perso je verrais deux soluces :
    - ne pas enregistrer la preview, juste la calculer et l'envoyer au client et créer les fichiers et insert bdd uniquement si la procédure complète est validée
    - stocker tout dans un rep temporaire mais faire un script de purge, donc définir un time-out et appeler le script à intervalles régulier ou sur l'index
    La première semble plus propre ^^

    (d'ailleurs la remarque de arnolem me fait penser à un truc que j'ai jamais tenté : stocker des fichiers temporaires dans le rep des sessions, files ou tmp, a priori y seront effacés direct par apache ou autre)
    Vive les roues en pierre

  6. #6
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Citation Envoyé par Djakisback
    d'ailleurs la remarque de arnolem me fait penser à un truc que j'ai jamais tenté : stocker des fichiers temporaires dans le rep des sessions, files ou tmp, a priori y seront effacés direct par apache ou autre
    J'en sais rien en faite, mais j'ai tendance à croire que non, car le systère est se base théoriquement sur le nom des fichiers, et de la date de dernière modification des fichiers.
    D'ailleurs, comme ça au feeling, je trouverais dangereux que le système supprime tous les fichiers sans savoir si c'est des fichiers de sessions ou pas.
    M'enfin, c'est mon raisonnement

    Sinon, pour le problème évoqué, il peu avoir une floppée de solutions.

    La 1ère, c'est de ne pas faire de prévisualisation, c'est de loin le plus simple car il y aurait plus de fichiers temporaire à créer.
    On pourrait envisager de créer un petit Javascript, avec la fonction window.confirm(), donc une demande de confirmation.
    S'il la personne confirme -> hop, on réduit l'image et on la dépose.


    Une 2ème, dans le cas ou tu souhaite conserver le principe de prévisualisation, c'est d'exploiter un système de cron (ou tache planifiée), et de purger le répertoire en question par période (1 fois par jour dans la nuit, ou 1 fois par semaine, peu importe).
    Il existe des sites (certains gratuits) qui offrent ce genre de service. Peut être même que ton hébergeur le propose.


    Une autre, la plus compliquée, mais ça dépend.
    Si tu as une gestion des sessions plus évoluée, tu pourrais exploiter le système de purge des fichiers automatique des sessions pour supprimer les images.
    La doc de Php donne une solution pour avoir un peu plus "la main" sur la gestion des sessions :
    http://fr2.php.net/manual/fr/functio...ve-handler.php
    Le principe serait simple. avant que le système ne supprime le fichier de session, il faudrait dé-sérialiser le fichier (en boucle), ensuite vérifier que la variable de session soit présente (celle qui contient les noms des images), récupérer leur nom et supprimer les fichiers.
    Ensuite le fichier de session est détruit.


    Ou alors, je me dis que tu as surement un espace administration, et tu pourrais par exemple prévoir un simple bouton pour déclencher la suppression des fichiers.
    C'est pas géantissime, car c'est manuel, mais ça reste très simple à mettre en place.
    Mais encore, peut être peux tu exploiter une certaine fonctionnalité que tu exécuterait de manière journalière, (par semaine, etc ...), suffirait de lui rajouter une fonction "supprime_image_temporaire()", faire une pierre 2 coups quoi.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  7. #7
    Membre habitué Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Points : 193
    Points
    193
    Par défaut
    Comment définie tu qu'un internaute quitte ton site ?
    C'est une notion qui n'existe pas en Web
    Justement la est mon problème, tout au moins en PHP. C'est pourquoi j'ai posté cette question sur le forum.

    Car en javascript, il existe la commande "onunload", qui s'active à la fermeture de la page.

    Pour l'instant j'ai décidé avec onunload d'envoyer une requête AJAX qui supprime mes variables.

    perso je verrais deux soluces :
    - ne pas enregistrer la preview, juste la calculer et l'envoyer au client et créer les fichiers et insert bdd uniquement si la procédure complète est validée
    - stocker tout dans un rep temporaire mais faire un script de purge, donc définir un time-out et appeler le script à intervalles régulier ou sur l'index
    Je ne vois pas trop comment faire pour juste les calculer sans les enregistrer ?
    Si on pouvait m'expliquer, ça m'aiderai à faire un choix de méthode.

    Une 2ème, dans le cas ou tu souhaite conserver le principe de prévisualisation, c'est d'exploiter un système de cron (ou tache planifiée), et de purger le répertoire en question par période (1 fois par jour dans la nuit, ou 1 fois par semaine, peu importe).
    Il existe des sites (certains gratuits) qui offrent ce genre de service. Peut être même que ton hébergeur le propose.
    Je pense que cette solution joue la sécurité, donc je mettrais en place un script de ce genre. Pour l'instant je suis en local, et les hébergements dont je dispose sont des mutualisés. Ah si si je peux faire du CRON mais pas sous forme de fichier mais dans le panneau d'admin de l'hébergeur.

    On pourrait envisager de créer un petit Javascript, avec la fonction window.confirm(), donc une demande de confirmation.
    S'il la personne confirme -> hop, on réduit l'image et on la dépose.
    Peux-tu développer ton idée s'il te plait ?

    Je vous montre ce que j'ai fait pour l'instant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    <html>
    <head>
    <script type="text/javascript">
    <!--
    var noOnunloadVar = "";
     
    function noOnunload()
    {
    noOnunloadVar = "stop";
    }
     
    window.onunload = function()
    {
    if(noOnunloadVar == "")
    {
    //J'envoie la requête AJAX pour executer le fichier php qui détruit mes sessions images.//
    }
    }
    //Si la variable noOnunloadVar est vide cela signifie que l'internaute quitte la page ou la recharge sans être passé par l'une des actions qui correspond au processus d'enregistrement du formulaire. Dans ce cas la, je purge tout.//
    -->
    </script>
    </head>
    <body>
    <form method="post" <!--etc.......-->   >
    <input type="file" name="" />
    <input type="submit" name="preview" value="aperçu" onclick="noOnunload();" /><!-- si le formulaire est envoyé depuis ce bouton ça renvoi le preview.-->
    <input type="submit" name="save" value="enregistrer" onclick="noOnunload();" /><!-- si le formulaire est envoyé depuis ce bouton ça enregistre le formulaire.-->
    Si la variable noOnunloadVar est vide cela signifie que l'internaute quitte la page ou la recharge sans être passé par l'une des actions qui correspond au processus d'enregistrement du formulaire. Dans ce cas la, je purge tout.

    Je pense coupler ça avec le CRON en hebdomadaire, qu'en pensez-vous ?

    La 1ère, c'est de ne pas faire de prévisualisation, c'est de loin le plus simple car il y aurait plus de fichiers temporaire à créer.
    HIHIHI, le plus simple c'est de ne pas faire de site internet, ça c'est sur !!! lol

    Merci à tous pour vos réponses.

  8. #8
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    L'évènement onunload n'est pas un mécanisme fiable, je dirais même pas du tout.
    Enfin, c'est mon avis.
    En tout cas, tu ne pourras jamais empêcher qu'un utilisateur ferme son navigateur, de même l'empêcher de supprimer le cookie qui fait le lien avec la session.
    Mais encore, beaucoup croient que le fait de fermer le navigateur détruit le cookie : Oui et non. Ce sont des idées reçues malgré tout.
    Ca dépend des navigateurs, et des versions, et de ce qu'ils proposent.
    Regarde du coté de Firefox, il y a (par défaut) 3 choix possibles du comment on souhaite gérer ses cookies :
    - Leur expiration
    - La fermeture de Firefox
    - me demander à chaque fois
    Donc si l'utilisateur choisie "leur expiration", et bien le cookie sera toujours valable même s'il ferme et ré-ouvre son navigateur.

    Autre scénario.
    La personne arrive sur la pévisualisation (donc l'upload vers le rep temporaire a eu lieu), et puis le gars ne fais plus rien. Le téléphone sonne, une envie pressante, va prendre un café, etc, etc ...
    Que se passe t-il ?
    A mon avis, la session sera expirée (par défaut c'est 1440 secondes soit 24 minutes).
    Du coup, s'il poursuit au-delà de cette limite, ça ne va pas l'faire, il n'y aura plus de concordance entre sa nouvelle session et celle précédente.

    En tout cas, dis toi bien que tu n'auras jamais "la main" du coté "client".
    Donc mettre en place une fonctionnalité aussi importante en se reposant sur le "client" risque fort de ne pas être fiable (voir pas du tout).


    Tu rigole sur le fait de t'avoir proposer de ne pas faire de prévisualisation, et bien si ça ne tenais qu'à moi, je ne le ferais pas ...
    Je partirais du principe que le gars qui a pris le temps de sélectionner la photo dans son PC + le fait de valider le formulaire (submit), et bien c'est qu'il souhaite que les choses soient faite.
    Plus de problème de fichier temporaire
    Faire une prévisualisation ça peu faire "pro", m'enfin, ça fait malgré tout une étape de plus.
    Est-ce vraiment utile ? (proportionnellement au problème que ça provoque)


    Pour le window.confirm() ?
    Et bien peut être qu'il aurait fallut essayer, tu aurait vu qu'est ce que ça y fait.
    Il y a 3 types de fenêtres dans ce genre :
    1/ window.alert() : Pour afficher un simple message (une alerte/message d'erreur le plus souvent)
    2/ window.confirm() : Demande une confirmation, il y a donc 2 boutons : L'un retourne VRAI, l'autre retourne FALSE (on accepte ou on accepte pas)
    Dans ton cas, ça pourrait suffire pour demander explicitement si la personne souhaite que l'upload de la photo soit faite.
    Cette fenêtre s'ouvrirait dès le submit du formulaire.
    3/ window.prompt() : La fenêtre rajoute une zone de texte afin que l'utilisateur puis saisir un texte.

    Je pense que cette solution joue la sécurité, donc je mettrais en place un script de ce genre. Pour l'instant je suis en local, et les hébergements dont je dispose sont des mutualisés. Ah si si je peux faire du CRON mais pas sous forme de fichier mais dans le panneau d'admin de l'hébergeur.
    Je serais étonné qu'un hébergeur propose ce genre de fonctionnalité, surtout pour du mutualisé.
    Mais regarde ce qu'il te propose, sait on jamais.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  9. #9
    Membre habitué Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Points : 193
    Points
    193
    Par défaut
    Autre scénario.
    La personne arrive sur la pévisualisation (donc l'upload vers le rep temporaire a eu lieu), et puis le gars ne fais plus rien. Le téléphone sonne, une envie pressante, va prendre un café, etc, etc ...
    Que se passe t-il ?
    A mon avis, la session sera expirée (par défaut c'est 1440 secondes soit 24 minutes).
    Du coup, s'il poursuit au-delà de cette limite, ça ne va pas l'faire, il n'y aura plus de concordance entre sa nouvelle session et celle précédente.
    Oui c'est vrai ce que tu dis et je suis pas un pro à ce niveau la mais je sais que les sessions périment. Ce que je sais pas c'est comment les configurer pour augmenter ou diminuer ce temps. Ceci étant serait-il possible en connaissance de ce délais, de faire une fonction javascript avec settimeout ou setinterval, pour renvoyer vers une page indiquant que le temps imparti est écoulé et qu'il faut recommencer la procédure?

    Ou sinon stocker dans un champ le timestamp au moment du chargement de la page. Et lors de la prochaine étape avant d'enregistrer par exemple vérifier le timestamp actuel avec celui du chargement pour être sur que les sessions sont toujours activent.(enfin peut faire plus simple vérifier si les sessions existent avec "isset". Dans la cas contraire renvoyer vers le début de la procédure).

    En tout cas merci pour toutes ces réflexions, ça m'aide énormément. Souvent les problèmes sont d'ordres rédactionnels et d'autres fois comme maintenant ils sont plus lié à une mis en forme d'un fonctionnement pour aboutir à quelque chose de sympa et fonctionnel. Je pense que ce genre de problème à ça place sur un forum.Merci

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Ce que je sais pas c'est comment les configurer pour augmenter ou diminuer ce temps
    Dans le php.ini il y a une directive session.gc_maxlifetime dont la valeur par défaut est 1440 secondes (normalement).
    Mais augmenter ce temps n'est pas obligatoirement la meilleure solution. Laisser une session trop longtemps active peut être un manque de sécurité.


    Pour ma part, je ne me prendrais pas autant la tête.
    Je me baserais justement sur ce délai d'expirations des sessions : 1440 (où la valeur que tu as de ton coté).
    Aussi, me baserais sur la date des fichiers (des images), fonction filemtime().
    Ensuite, suffirait de prendre comme principe que tous fichiers dépassant le délai est à supprimer, les fichiers trop anciens en faite (inférieurs à : date en cours - 1440).
    (ce qui doit être le cas car théoriquement une session expirée ne peut être reconduite).

    Ensuite, je créerais une simple fonction (genre purge_image_temporaire) qui elle s'occupera de parser le répertoire (chaque fichier) afin de récupérer la date, et contrôler sa validité.
    Cette fonction serait exécutée à chaque fois qu'il y aura un upload, juste avant par exemple.
    Théoriquement, cette sur-couche de code/traitement ne devrait pas être lourd, surement très léger même, car des fichiers à supprimer, il devrait en avoir très peu en faite, car les cas devraient être très rares, exceptionnels.
    La plus grande majorité des cas, ce répertoire devrait être vide je dirais même.
    Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20
    Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra]

  11. #11
    Membre habitué Avatar de xess91
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 408
    Points : 193
    Points
    193
    Par défaut
    Merci à tous pour vos réponses!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 12/01/2012, 13h51
  2. Perte des variable de session au changement de page.
    Par [Xt-6] dans le forum Langage
    Réponses: 11
    Dernier message: 15/01/2009, 21h28
  3. Réponses: 6
    Dernier message: 18/11/2008, 18h31
  4. Détruire une variable de session
    Par paradeofphp dans le forum ASP.NET
    Réponses: 4
    Dernier message: 04/09/2007, 13h08
  5. Détruire une variable session
    Par tiyolx dans le forum Langage
    Réponses: 1
    Dernier message: 06/05/2006, 18h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo