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 :

[POO] utilité de serialize et unserialize / __sleep et __wakeup


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut [POO] utilité de serialize et unserialize / __sleep et __wakeup
    Bonjour,

    J'ai besoin d'une confirmation ou d'un avis contraire svp.

    A savoir que les deux fonctions serialize et unserialize ne sont pas utiles à moins que l'on veuille conserver des valeurs bien précises de nos objets. PHP serializant et désérializant automatiquement.

    Pouvez-vous m'apporter votre avis sur ces deux fonctions ?

    Je suis dans le contexte d'authentification utilisateur sur un site :

    Je dispose de 2 patterns (factory et singleton) et d'une classe utilisateur.
    Ma Singleton interface les utilisateurs et la base de données (controle d'authentification, ajout suppression etc...), ma Factory détermine le type d'utilisateur (création d'une instance différente par utilisateur, new guest, new admin etc...) et ma classe user reçoit uniquement l'ID d'un user identifié.

    Dans mon cas actuel, l'objet User est serializé d'une page à l'autre mais dans quel cas aurais-je besoin des fonctions __sleep et __wakeup pour cet objet?

    merci
    Développeur Web sénior (2005) spécialisé Symfony2 - Je tiens mon petit blog tranquillement, viens faire un tour http://www.ikonenn.com

  2. #2
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Salut,
    tu pourrais en avoir besoin si l'objet contient une référence d'une connexion à la base de données encore active au moment de la serialisation.
    Si tu essaye de serialiser une connexion active dans le thread correspondant au traitement d'une requête http, puis de ressusciter cette connexion par la suite en la déserialisant depuis un autre thread, php va t'insulter et ça ne marchera pas.
    D'où l'utilité de déconnecter la bd juste avant la serialisation, et de la reconnecter juste après la déserialisation ...

  3. #3
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut
    Oui mais j'ai écarté cette condition car j'utilise des objets de connexion aux bases de données avec des méthodes d'ouvertures et de fermetures.
    Donc je n'ai jamais besoin de vérifier si une connexion est encore active.

    merci de ta réponse
    Développeur Web sénior (2005) spécialisé Symfony2 - Je tiens mon petit blog tranquillement, viens faire un tour http://www.ikonenn.com

  4. #4
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    et ce sont bien ces objets en question qui sont sérialisés ?
    Pasque si tu serialise un utilisateur qui a une référence vers l'objet de connexion, lorsque tu déserialise l'utilisateur, l'objet gèrant la connexion a été détruit entre-temps, donc la référence n'est plus valable ...
    Des différences assez subtiles peuvent faire que ça marche ou que ça plante lamentablement ...
    J'ai mis en place ce genre de trucs ya pas très longtemps, et ça n'a pas marché du 1er coup avant que je trouve la bonne formule ...
    Peux tu nous faire voir le squelette des classes concernées ?

  5. #5
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut
    En fait j'ai du mal à comprendre l'intérêt de conserver une connexion ouverte entre deux pages.
    Qd j'effectue une ou plusieurs requêtes, j'ouvre une connexion sql puis je la ferme une fois executées.
    Développeur Web sénior (2005) spécialisé Symfony2 - Je tiens mon petit blog tranquillement, viens faire un tour http://www.ikonenn.com

  6. #6
    Membre éclairé Avatar de Hervé Saladin
    Homme Profil pro
    Ingénieur d'études en développement et déploiement d'applications
    Inscrit en
    Décembre 2004
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur d'études en développement et déploiement d'applications
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2004
    Messages : 647
    Points : 799
    Points
    799
    Par défaut
    Citation Envoyé par speedev
    En fait j'ai du mal à comprendre l'intérêt de conserver une connexion ouverte entre deux pages.
    Mais ça n'en a aucun !!!
    Au mieux ça ne fonctionnera pas, au pire ça va foutre le b*****azard sur ton serveur si tu commence à te lancer dans ce genre de trucs !
    Citation Envoyé par speedev
    Qd j'effectue une ou plusieurs requêtes, j'ouvre une connexion sql puis je la ferme une fois executées.
    et tu as bien raison
    Si tes connexions sont gérées ailleurs dans le code, et bien gérées, tu n'auras pas besoin d'écrire des méthodes sleep ou wakeup.

    Par contre, cela peut s'avèrer utile si tu veux laisser les objets placés en session gèrer eux-même et automatiquement la connexion.
    Exemple théorique : moi dans mes applis j'implémente souvent le design pattern "Active Record" où les classes métier gèrent elle-mêmes les accès à la BD.
    Si je code une implémentation hyper basique, mes objets ouvrent une connection avec mysql_pconnect() dans le constructeur, et balancent des instructions SQL à grands coups de mysql_query() dans les méthodes chargées de la persistance, enfin mon destructeur (appelé implicitement par l'interpreteur php) appelle mysql_close().
    Jusque là ... tout va bien ...
    Sauf que si je serialise mon objet pour le mettre en session, il n'est pas détruit, et donc le destructeur n'est pas apellé
    DONC : je redéfinis la méthode sleep, et j'y mets aussi un mysql_close() ... idem pour le wakeup ou je reconnecte ...

    Tu vois mieux à quoi ça peut servir ?

    Evidemment, il peut y avoir d'autres cas de figure ou ça peut être utile, celui de la connexion à la BD n'en est qu'un parmis d'autres, mais je suppose que ça doit être l'un des plus classiques ...

    PS : je précise pour ceux qui me liraient, que si vous faites du PHP objet, et que en plus vous avez le bon goût d'implémenter des design pattern, tant que vous y êtes, évitez de faire ce que j'ai fait dans l'exemple à savoir balancer des vulgaires mysql_query ... utilisez plutôt une couche d'abstraction de base de données genre PDO, PEAR::MDB & cie, ça sera nettement plus clean

  7. #7
    Membre averti Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par Hervé Saladin Voir le message
    Mais ça n'en a aucun !!!
    Au mieux ça ne fonctionnera pas, au pire ça va foutre le b*****azard sur ton serveur si tu commence à te lancer dans ce genre de trucs !
    Biensur
    Citation Envoyé par Hervé Saladin Voir le message
    et tu as bien raison
    Ouais c'est pour ça que je demandais une confirmation car à force de lire des idioties sur certains sites, on finit par ne même plus savoir quoi penser. Cela étant, je n'ai jamais fais fausse route jusque maintenant! J'étais dans le vrai.
    Citation Envoyé par Hervé Saladin Voir le message
    Si tes connexions sont gérées ailleurs dans le code, et bien gérées, tu n'auras pas besoin d'écrire des méthodes sleep ou wakeup.
    On est d'accord
    Citation Envoyé par Hervé Saladin Voir le message
    Par contre, cela peut s'avèrer utile si tu veux laisser les objets placés en session gèrer eux-même et automatiquement la connexion.
    Exemple théorique : moi dans mes applis j'implémente souvent le design pattern "Active Record" où les classes métier gèrent elle-mêmes les accès à la BD.
    Classes métier....ça sent le JAVA ^^
    Citation Envoyé par Hervé Saladin Voir le message
    Si je code une implémentation hyper basique, mes objets ouvrent une connection avec mysql_pconnect() dans le constructeur, et balancent des instructions SQL à grands coups de mysql_query() dans les méthodes chargées de la persistance, enfin mon destructeur (appelé implicitement par l'interpreteur php) appelle mysql_close().
    Jusque là ... tout va bien ...
    On utilise le même principe sauf que j'ignorais le pattern active_record()! Merci de l'info.
    Citation Envoyé par Hervé Saladin Voir le message
    Sauf que si je serialise mon objet pour le mettre en session, il n'est pas détruit, et donc le destructeur n'est pas apellé
    DONC : je redéfinis la méthode sleep, et j'y mets aussi un mysql_close() ... idem pour le wakeup ou je reconnecte ...
    Ok je comprends mieux!
    Citation Envoyé par Hervé Saladin Voir le message
    Tu vois mieux à quoi ça peut servir ?
    Bah oui je viens de dire "je comprends mieux!"
    Citation Envoyé par Hervé Saladin Voir le message
    Evidemment, il peut y avoir d'autres cas de figure ou ça peut être utile, celui de la connexion à la BD n'en est qu'un parmis d'autres, mais je suppose que ça doit être l'un des plus classiques ...

    PS : je précise pour ceux qui me liraient, que si vous faites du PHP objet, et que en plus vous avez le bon goût d'implémenter des design pattern, tant que vous y êtes, évitez de faire ce que j'ai fait dans l'exemple à savoir balancer des vulgaires mysql_query ... utilisez plutôt une couche d'abstraction de base de données genre PDO, PEAR::MDB & cie,
    Ouep j'utilise PDO avec deux objets que j'ai créé pour manipuler cette extension, l'un pour la connexion, l'autre pour les requêtes.[...]
    Citation Envoyé par Hervé Saladin Voir le message
    [...]ça sera nettement plus clean
    Comme mon esprit maintenant !

    Merci à toi, je continue ma route.

    Tchaw
    Développeur Web sénior (2005) spécialisé Symfony2 - Je tiens mon petit blog tranquillement, viens faire un tour http://www.ikonenn.com

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

Discussions similaires

  1. [SimpleXML] serialize et unserialize
    Par youtch dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 25/05/2009, 16h48
  2. Question sur Serialize et unserialize
    Par crashyear dans le forum Langage
    Réponses: 2
    Dernier message: 19/10/2007, 14h41
  3. [POO] Utilité de 'final','interface' ?
    Par guillhomme_ dans le forum Langage
    Réponses: 4
    Dernier message: 17/10/2007, 17h05
  4. [POO] Utilité d'un singleton en php5
    Par WalidNat dans le forum Langage
    Réponses: 1
    Dernier message: 26/05/2007, 15h08
  5. [POO] Utilité... ?
    Par soad dans le forum Langage
    Réponses: 17
    Dernier message: 21/09/2006, 04h46

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