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 :

Restitution d'objet grâce aux sessions


Sujet :

Langage PHP

  1. #1
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut Restitution d'objet grâce aux sessions
    Bonjour,

    Je me pose une question pour un de mes futurs projets perso.

    En effet, j'ai prévu d'enregistrer un objet en session afin de pouvoir restaurer le même objet de page en page.

    Au départ, j'avais trouvé une idée sur le net : dé/sérialiser l'objet en session à chaque fin et début de requête.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static function saveCurrentObject(Object $objet){
         $_SESSION['objet'] = serialize($objet);
    }
    public static function restoreCurrentObject(){
         return isset($_SESSION['objet']) ? unserialize($_SESSION['objet']) : null;
    }
    public static function clearCurrentObject(){
         if(isset($_SESSION['objet'])) unset($_SESSION['objet']);
    }
    Mais vu la taille de mon objet, je trouve ça un peu... énorme à stocker. Je ne connais pas la mémoire utilisée pour la session mais j'imagine qu'elle n'est pas illimitée. J'ai donc modifié le code ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static function saveCurrentObject(Object $objet){
         $_SESSION['objet'] = $objet->getId();
    }
    public static function restoreCurrentObject(){
         return isset($_SESSION['objet']) ? new Objet($_SESSION['objet']) : null;
    }
    public static function clearCurrentObject(){
         if(isset($_SESSION['objet'])) unset($_SESSION['objet']);
    }
    En gros, je garde uniquement les éléments servant à construire l'objet et le reconstruit à chaque requête après.

    Je n'utilise pas les exemples ci-dessus tels quels, ils servent uniquement... d'exemples pour illustrer mon raisonnement.

    Laquelle des solutions vous parait la moins gourmande en ressources ? Laquelle est la plus rapide ?
    Et surtout, y a-t-il une autre solution que je n'aurais pas trouvé sur le net et à laquelle je n'aurais pas pensé ? (Sachant que je suis en PHP 5.2.17)

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    ça pourrait t’intéresser si tu ne l'as pas déjà lu

    http://www.devshed.com/c/a/PHP/The-S...ns-in-PHP-5/2/

    edit: avec le lien php.net c'est mieux http://php.net/manual/fr/oop4.magic-functions.php

  3. #3
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Ah ! Oui effectivement, j'avais lu ça.

    Le problème, c'est la récupération. Car je peux avoir plusieurs instances du même objets sur une page et je ne sais pas trop comment le gérer avec les méthodes magiques __sleep() et __wakeup()

    Et apparemment, la page que tu donnes s'arrête avant cette explication

    Si tu as d'autres exemples mieux expliqués, je suis preneur !

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    http://www.devshed.com/c/a/PHP/The-S...ns-in-PHP-5/3/

    oui exactement du coup je pense que c'est bien la solution la plus approprié

  5. #5
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Le lien du manuel explique bien ce que ça fait et comment l'utiliser.
    Au final, ça enregistre l'objet sérialisé dans un fichier... ça revient au même que ce que je fais. J'ai juste réinventé la roue ?

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 349
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 349
    Points : 1 460
    Points
    1 460
    Par défaut
    je préféré l'exemple de mon dernier lien

    sinon oui c'est ce que tu fais donc en gros moi :
    implementation du sleep/wakeup
    et ensuite session_register() et session_unregister() pr les passer en session.

  7. #7
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Je ne connais pas la mémoire utilisée pour la session mais j'imagine qu'elle n'est pas illimitée
    Sauf indication contraire, ça part sur fichier.

    Laquelle des solutions vous parait la moins gourmande en ressources ? Laquelle est la plus rapide ?
    Je dirai, ça va dépendre de la taille de tes objets et des ressources consommées par la construction. Donc il faut voir si l'unserialize va plus vite que le constructeur, ce que tu peux faire avec un petit coup de profiling.

    Tu pourrais peut être gagner à définir une logique de persistance découplée, ce qui te permettrait de choisir au runtime quelle stratégie adopter en fonction des objets à sérialiser (DB, Memcached, Redis, $_SESSION ou autre).

    Juste une question:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static function saveCurrentObject(Object $objet){
    Je ne comprends pas du tout ce prototype.

  8. #8
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Citation Envoyé par boo64 Voir le message
    implementation du sleep/wakeup
    et ensuite session_register() et session_unregister() pr les passer en session.
    J'ai bien lu des tutoriaux et de la doc sur __sleep() et __wakeup().
    Ils servent principalement à "nettoyer" l'objet ou à activer des méthodes avant de "l'éteindre" et de le "rallumer". Or, je ne pense pas en avoir besoin (pour l'instant) dans le cas présent.
    Par ailleurs, session_register est obsolète et déconseillée...
    http://php.net/manual/fr/function.session-register.php

    Citation Envoyé par Benjamin Delespierre Voir le message
    Sauf indication contraire, ça part sur fichier.
    Effectivement, mais je pensais que ces fichiers avaient une limite de taille. Peut-être pas si j'en crois la doc. De toute manière, je n'ai pas accès au PHP.ini sur mon hébergement, donc ça aurait été limité de ce côté là
    Mais ça m'a permit de découvrir http://fr2.php.net/manual/fr/functio...ve-handler.php qui permet de changer pas mal de choses sur la gestion des fichiers de session

    Citation Envoyé par Benjamin Delespierre Voir le message
    Je dirai, ça va dépendre de la taille de tes objets et des ressources consommées par la construction. Donc il faut voir si l'unserialize va plus vite que le constructeur, ce que tu peux faire avec un petit coup de profiling.
    Je crois que je ne vais pas avoir le choix que de faire du profiling. Zut

    Citation Envoyé par Benjamin Delespierre Voir le message
    Je ne comprends pas du tout ce prototype.
    J'ai écrit cet exemple rapidement et de tête. Personnellement, il ne me gène pas plus que ça.

  9. #9
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Effectivement, mais je pensais que ces fichiers avaient une limite de taille
    Si c'est le cas, je ne l'ai jamais franchie et pourtant je suis pas tendre avec mes sessions

    De toute manière, je n'ai pas accès au PHP.ini sur mon hébergement, donc ça aurait été limité de ce côté là
    Il existe une documentation des propriétés du php.ini qui peuvent être définies au runtime ou dans le htaccess (c'est la colonne changeable qui t'intéresse).

    Je crois que je ne vais pas avoir le choix que de faire du profiling. Zut
    A mon avis, l'unserialize ira plus vite, mais que ça ne t'empêche pas de faire des tests
    Juste un conseil pour l'optimisation: quel que soit la performance de ton algo, il ira moins vite en règle générale que les fonctions natives de PHP, par exemple, une manipulation de tableau avec des array_merge, array_combine, array_intersect et leurs petits copains va toujours plus vite qu'une boucle pour traiter ledit tableau.

    J'ai écrit cet exemple rapidement et de tête. Personnellement, il ne me gène pas plus que ça.
    Comment peut-il y avoir une notion de "current object" dans une méthode statique, et pourquoi s'appelle t'elle saveCurrentObject alors qu'elle prends un objet en paramètre. Elle devrait s'appeller saveObject, c'est ce que je voulais dire.

  10. #10
    Membre éclairé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2011
    Messages
    411
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2011
    Messages : 411
    Points : 735
    Points
    735
    Par défaut
    Haha, ok, je suis pas le seul à utiliser assez intensivement les sessions

    Je ne savais pas qu'on pouvait changer autant de chose dans un .htaccess.
    Je ne suis pas sûr de la syntaxe. C'est bien :
    ?

    (et pour les intéressés qui liront, cette page indique quels sont les constantes définies pour savoir quelles propriétés sont changeables et dans quelle endroit)

    En gros, comme pour l'instant je n'utilise quasiment que des fonctions de base de PHP (unserialize/serialize, mise en session, etc...) ça n'influerai pas.

    Effectivement, le "current" est de trop, surtout que je pourrais avoir plusieurs instances du même objet à "sauvegarder". C'est pas trop logique comme terme mais l'algo est acceptable.

  11. #11
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Oui c'est cette syntaxe, par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    php_flag short_open_tag 1

Discussions similaires

  1. Réponses: 15
    Dernier message: 16/05/2007, 16h53
  2. [POO] PHP 5, transmettre objet dans la session
    Par FCDB dans le forum Langage
    Réponses: 2
    Dernier message: 23/05/2006, 14h26
  3. Optimiser grâce aux tables temporaires
    Par dcollart dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/07/2005, 10h11
  4. Cacher des objets grâce à l'Objet TreeView
    Par The_Warlord dans le forum Composants VCL
    Réponses: 2
    Dernier message: 08/11/2004, 09h50

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