|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Membre éclairé
![]() Développeur Web Inscription : mai 2006 Messages : 936 ![]() |
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 |
|
|
00
|
|
|
#2 |
|
Membre chevronné
![]() Développeur Web Inscription : décembre 2004 Messages : 636 ![]() |
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 |
|
|
00
|
|
|
#3 |
|
Membre éclairé
![]() Développeur Web Inscription : mai 2006 Messages : 936 ![]() |
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 |
|
|
00
|
|
|
#4 |
|
Membre chevronné
![]() Développeur Web Inscription : décembre 2004 Messages : 636 ![]() |
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 |
|
|
00
|
|
|
#5 |
|
Membre éclairé
![]() Développeur Web Inscription : mai 2006 Messages : 936 ![]() |
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 |
|
|
00
|
|
|
#6 | ||
|
Membre chevronné
![]() Développeur Web Inscription : décembre 2004 Messages : 636 ![]() |
Citation:
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:
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 |
||
|
|
00
|
|
|
#7 | ||||||
|
Membre éclairé
![]() Développeur Web Inscription : mai 2006 Messages : 936 ![]() |
Citation:
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:
Citation:
Citation:
Citation:
Bah oui je viens de dire "je comprends mieux!" Citation:
Comme mon esprit maintenant ! Merci à toi, je continue ma route. Tchaw
__________________
Développeur indépendant sur technos Web à votre service |
||||||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com