Page 1 sur 1
PHP5
Posté : 23 juin 2005, 14:48
par steeve
Bonjour,
J'essaie de comprendre comment batir une application en PHP 5 en utilisant les objets.
Je n'arrive pas à voir comment "garder en vie" les instances des objets lorsque l'on passe d'une page php à l'autre.
En java par exemple on a un "main" duquel dépend directement ou indirectement toutes les instances créés
J'ai pu lire que l'on peut enregistrer les valeurs des attributs des objets instanciés via les sessions mais apparement cette métode est limitée et elle me semble plutot lourde. En effet à chaque fois que l'on change de page il y a un processus d'écriture puis lecture des données dans le fichier de session.
Y a t il d'autres moyens pour garder en mémoire les instances des objets ?
Posté : 23 juin 2005, 15:01
par naholyr
À part les sessions, ou la mise en cookie, non. Mais tu seras tot ou tard amené à utiliser les sessions, n'hésite pas à le faire plus tôt que tard

Posté : 23 juin 2005, 15:03
par fggdm
Salut,
Non, hélas il faut faire sans mémoire*. Il faut passer par la sérialisation, c'est un peu le principe des sessions en fait. En quoi les sessions sont-elles limitées en PHP ?
J'utilise un cache d'objets pour ce qui est partagé (toujours en passant par la sérialisation).
* c'est aussi pour ça qu'il n'y a pas de pool de connexion possible.
Posté : 23 juin 2005, 15:18
par Guakamol
J'utilise un cache d'objets pour ce qui est partagé (toujours en passant par la sérialisation).
un peu plus de détails pourrais m"etre utile s'il te plait. Quand tu dit "partagé" c'est entre plusieurs clients ??[/quote]
Posté : 23 juin 2005, 15:35
par fggdm
Salut,
Un cache d'objets est indispensable et pas pour des raisons de performance.
Le plus simple est de prendre un exemple.
Prenons le cas de sociétés qui ont des représentants dans différents pays. Nous avons une classe Societe qui a un champ representant (une liste d'objets de type Pays).
Tu souhaites obtenir la liste de toutes les sociétés et tu obtiens :
- PHPFrance {representants=array[france, usa, gabon]}
- Zend {representants=array[allemagne, usa, italie]}
On voit que les deux sociétés ont des représentants dans le même pays (usa). Il faut que l'objet usa soit unique, que les deux sociétés pointent vers le même objet usa. Pour le retrouver il faut le "stocker" quelque part... dans un cache.
Il n'est pas obligé de sérialiser le cache mais là ça devient intéressant pour des objets souvent utilisés et pour les verrouillages.
Il y a une autre solution "moins objet" qui permet d'éviter l'utilisation d'un cache d'objets c'est au lieu de référencer des objets dans les champs (france, usa...) c'est d'utiliser les identifiants uniques (comme les clefs primaires) et là on n'a pas besoin de retrouver une instance existante.
Posté : 23 juin 2005, 15:37
par steeve
En quoi les sessions sont-elles limitées en PHP ?
Merci pour vos réponses.
Je n'ai pas d'exemple concret pour les "limites" des sessions. Par contre elles sont évoquées dans de la litterature php en évoquant des objets DOM, des connextions réseau ou des fichiers necessitant des données plus complexes que des chaines de caractères.
Posté : 23 juin 2005, 15:41
par Guakamol
oki pour l'utilité du cache

mais comment qu'on fait ?? (t'aurai pas un ptit tuto de derriere les fagots a me passer :p)
Posté : 23 juin 2005, 15:42
par fggdm
Sinon j'ai oublié de répondre à ta question en quelque sorte, oui il est possible d'imaginer avoir besoin d'un objet partagé entre plusieurs utilisateurs et là il faut le serialiser pour le retrouver dans l'état où l'a laissé le précédent "client". Ainsi c'est beaucoup plus simple que de passer par la base de données et pour les fans de la performance c'est conseillé.
Autre avantage, imaginons un formulaire à états, c'est à dire découpé en plusieurs pages (écrans de saisie) car il y a beaucoup de données à renseigner et de natures diverses.
Tant que tu n'as pas validé définitivement le formulaire il faut stocker temporairement les données, autant récupérer les objets dans un cache ce qui évite la connexion à la base, l'interrogation plus l'instanciation !
C'est là aussi qu'on voit l'utilité d'utiliser un système de verrous car sur des saisies longues il y a des chances qu'un autre utilisateur vienne travailler sur la même entité et là il faut bien le prévenir que quelqu'un est déjà en train de travailler dessus.
Message edité pour des corrections orthographiques.
Posté : 23 juin 2005, 15:51
par Guakamol
Oui mais comment on fait pour gerer un cache coté serveur ?
En gros il faut pouvoir a l'initialisation recuperer les donnes de la bdd creer les objets dont on a besoin et les mettre en cache, puis chaque client se connectant a l'appli peut acceder au cache et donc travailler sur les objets et remodifier le cache, enfin quand il n'y a plus de client le cache met a jour la base de données...
Ca c'est plus ou moins ce que j'ai compris, mais je sais pas comment faire en PHP 5 (je vois pas de couche APPLICATION en fait....)
Posté : 23 juin 2005, 16:03
par fggdm
Salut,
Prenons l'exmple d'une authentification (très simplifié maisl e principe est là) :
1 - Un client valide son login/pwd
2 - La requête est envoyée au controlleur
3 - Le contrôleur demande à un coordinateur de traiter la requête
4 - Le coordinateur est client de la couche d'accès aux données et demande getUser(login, pwd)
5 - La classe qui fournit ce service est une "interface" entre les coordinateurs, les caches, la base de données et autres sources, le client se moque de savoir d'où vient l'objet
6 - L'interface cherche d'abord l'objet dans le cache, s'il n'y est pas elle le récupère ailleurs puis le met dans le cache, enfin retourne l'objet.
7 - Le coordinateur et le controlleur finissent leur boulot.
Tu ne mets pas directement l'objet "user" dans le cache, tu dois d'abord le rendre "cachable", tu créés une classe CacheableObject qui a un champ objet (la référence vers le "user" par exemple. Ca permet de gérer d'autres propriétés d'un objet "cachable" comme le moment auquel il est devenu cachable et par exemple combien de temps il doit rester en chache sans que l'on vienne le chercher, c'est à dire qu'à chaque fois que l' "interface" vient chercher un objet dans le cache il faut rallonger sa durée de vie (par exemple le temps d'une session).
C'est résumé comme je dis mais l'essentiel est là.
En effet comment détruire l'objet périmé en PHP ? La première solution est de vérifier tous le cache à chaque fois qu'on vient chercher un objet mais en cas de gros cache ça peut mettre en péril l'application. Comme en pHP il n'y a pas de gestion de processus on peut très bien passer par une tâche exécutée sur le serveur.
Posté : 23 juin 2005, 16:05
par fggdm
Désolé pour les fautes, j'ai tapé trop vite et je dois m'absenter.
@+
Posté : 23 juin 2005, 16:10
par Guakamol
Ok merci beaucoup je vais voir ce que je peux faire avec ca, j'ai encore un peu du mal a voir comment mais deja j'ai un point de depart et c'est beaucoup mieux que ce matin

Utilisation d'un objet persistant !
Posté : 13 nov. 2006, 19:02
par lemoineo
C'est la notion d'objet persistant en base de donnée !
Chaque objet est enregistré (par ses identifiants) dans une base SQL (ou un fichier TEXTE ou XML
Si cela t'intéresse, j'utilise une classe de ma composition, je peux décrire comment elle fonctionne