Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/09/2007, 16h30   #1
Membre éclairé
 
Avatar de speedev
 
Développeur Web
Inscription : mai 2006
Messages : 936
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2006
Messages : 936
Points : 347
Points : 347
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 indépendant sur technos Web à votre service
speedev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 17h17   #2
Membre chevronné
 
Avatar de Hervé Saladin
 
Développeur Web
Inscription : décembre 2004
Messages : 636
Détails du profil
Informations personnelles :
Âge : 30

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2004
Messages : 636
Points : 689
Points : 689
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 ...
__________________
Ne cliquez pas sur ce lien
Hervé Saladin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 17h20   #3
Membre éclairé
 
Avatar de speedev
 
Développeur Web
Inscription : mai 2006
Messages : 936
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2006
Messages : 936
Points : 347
Points : 347
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 indépendant sur technos Web à votre service
speedev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/09/2007, 17h26   #4
Membre chevronné
 
Avatar de Hervé Saladin
 
Développeur Web
Inscription : décembre 2004
Messages : 636
Détails du profil
Informations personnelles :
Âge : 30

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2004
Messages : 636
Points : 689
Points : 689
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 ?
__________________
Ne cliquez pas sur ce lien
Hervé Saladin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2007, 09h14   #5
Membre éclairé
 
Avatar de speedev
 
Développeur Web
Inscription : mai 2006
Messages : 936
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2006
Messages : 936
Points : 347
Points : 347
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 indépendant sur technos Web à votre service
speedev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2007, 11h00   #6
Membre chevronné
 
Avatar de Hervé Saladin
 
Développeur Web
Inscription : décembre 2004
Messages : 636
Détails du profil
Informations personnelles :
Âge : 30

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2004
Messages : 636
Points : 689
Points : 689
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
__________________
Ne cliquez pas sur ce lien
Hervé Saladin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/09/2007, 11h11   #7
Membre éclairé
 
Avatar de speedev
 
Développeur Web
Inscription : mai 2006
Messages : 936
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : mai 2006
Messages : 936
Points : 347
Points : 347
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 indépendant sur technos Web à votre service
speedev est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h03.


 
 
 
 
Partenaires

Hébergement Web