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] Singleton en PHP et persistance


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut [POO] Singleton en PHP et persistance
    Bonjour à tous,

    voilà j'ai écrit un singleton en PHP5 et il fonction bien... mais seulement pour la durée de vie d'une page.
    N'y a t-il pas moyen de rendre un singleton réellement persistant ?

    voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    class fwk_messages {
         private static $_instance;
     
         private $attribut;
     
         private function __construct(){
             // rien juste histoire que le constructeur soit pas public
         }
     
         public function &getInstance(){
    	if (!isset(self::$_instance)) {
    		echo "<b><br>==>CREATION INSTANCE <br></b>";
    		self::$_instance = new fwk_messages(); 
    	}
    	return self::$_instance;
         }
     
         public function setAttribut( $a ){
             $this->attribut = $a ;
         }
    }
     
     
    // lorsque dans un script je fait :
     
    $truc = fwk_messages::getInstance();
    $truc->setAttribut( "Scoubidoo" );
     
    $bidule = fwk_messages::getInstance();
    // il recupere bien la meme instance le singleton est OK...
    par contre si dans ce script je met un lien html vers une autre page PHP et que je récupere l'instance du singleton.

    Et bien ce n'est plus la même, et du coup "attribut" est vide.

    Mon singleton n'a vécqu que le temps d'une page....

    Merci de votre aide

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    je pense que tu peux stocker ton instance en session et modifier getInstance()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isset($_SESSION['fwk_messages'])) {
    self::$_instance = $_SESSION['fwk_messages'];
    }
    else if (!isset(self::$_instance)) {
    ...
    Si t'as pas la sérialisation auto faudra utiliser serialize()/unserialize().
    Le problème c'est qu'il faut copier l'objet en session à chaque fin de script.

    Bye

  3. #3
    NoT
    NoT est déconnecté
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Points : 280
    Points
    280
    Par défaut
    Salut,

    Il va falloir te pencher sur une sauvegarde manuelle des propriétés de ton objet, pour créer une persistence, c'est précisément l'utilité des fonctions serialize / deserialize de PHP :

    http://fr2.php.net/manual/fr/function.serialize.php
    http://fr2.php.net/manual/fr/function.unserialize.php

    Ou bien enregistrer manuellement chaque propriété de l'objet dans une base.

    Au choix suivant l'utilisation que tu fais ensuite de tes données.

    C'est à ma connaissance les seules façons de faire.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Merci beaucoup
    Citation Envoyé par Djakisback
    Salut,
    je pense que tu peux stocker ton instance en session et modifier getInstance()

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (isset($_SESSION['fwk_messages'])) {
    self::$_instance = $_SESSION['fwk_messages'];
    }
    else if (!isset(self::$_instance)) {
    ...
    Si t'as pas la sérialisation auto faudra utiliser serialize()/unserialize().
    Le problème c'est qu'il faut copier l'objet en session à chaque fin de script.

    Bye


    je pensais également à cette solution.
    Venant de l'unnivers Java, je trouve ca pas terrible et presque paradoxal de passer par la session pour concerver un singleton, mais bon il semble pas y avoir de meilleure solution.

    Du coup, je me suis pausé la question autant bosser en session et ne pas utiliser de singleton.... mais non le singleton reste tout de même mieux à mon sens, plus "propre POO parlant et, y a pas de risque qu'il soit cassé par innadvertence dans une autre partie du code (comme ca peu aussi être le cas avec des globales...bouu! j'M pô les globales )...

    Merci beaucoup pour votre contribution

  5. #5
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Effectivement en me relisant je me suis également dis que la classe singleton devenait pratiquement inutile ^^

    (PS : Je pense que tu as compris qu'avec cette soluce il y aura un singleton par client, sinon il faut prendre la soluce de NoT)

  6. #6
    NoT
    NoT est déconnecté
    Membre actif
    Profil pro
    Inscrit en
    Février 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 237
    Points : 280
    Points
    280
    Par défaut
    Salut,

    Venant de l'unnivers Java, je trouve ca pas terrible et presque paradoxal de passer par la session pour concerver un singleton, mais bon il semble pas y avoir de meilleure solution.
    En même temps il faudrait te poser la question suivante : as-tu besoin de la persistence de tout ton objet ? Je veux dire l'objet fait la puissance de JAVA mais également une de ses grandes faiblesses, on veut faire de l'objet à tout va même là ou yen a pas forcément besoin.

    Dans ton cas à mon avis la persistence des données suffit, peut-etre même que de certaines données triées sur le volet, suivant le nombre, la structuration et l'accès que tu souhaites faire à ses données tu as de multiples choix techniques à faire.

  7. #7
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 438
    Points : 15 812
    Points
    15 812
    Par défaut
    Citation Envoyé par ProximIT
    Venant de l'unnivers Java, je trouve ca pas terrible et presque paradoxal de passer par la session pour concerver un singleton,
    le "scope" session existe de la même façon qu'en Java mais si j'ai bien compris, tu as besoin du "scope" application et là en PHP tu peux reproduire ça à l'aide d'une base de données.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Yes sir....
    Citation Envoyé par mathieu
    le "scope" session existe de la même façon qu'en Java mais si j'ai bien compris, tu as besoin du "scope" application et là en PHP tu peux reproduire ça à l'aide d'une base de données.

    C'est exactement ca.

    En fait voici mon problème : je doits développer une application Intranet (environ 80 utilisateurs intensifs et simultanés), utilisant une base de donnée sur SQL Server. Le problème est bien là, car la license disponible pour le serveur BDD n'authorise que 10 connexions simultanées.

    Il me faut donc absolument maîtriser le nombre de connexions à la base.


    Il faudrait concrètement que chaque utilisateur de l'application récupère la même instance de connection... ( ou une instance parmis X car je ferais certainement un Multiton plutôt qu'un Singleton)

    Merci beaucoup

  9. #9
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 438
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 438
    Points : 15 812
    Points
    15 812
    Par défaut
    Citation Envoyé par ProximIT
    car la license disponible pour le serveur BDD n'authorise que 10 connexions simultanées.
    utilise un autre SGBDR alors, il y en a plein en Open Source qui peuvent surement remplacer cette base de données limitée.
    et sinon, en théorie un simple fichier texte est aussi une base de données donc tu peux stocker ton objet dans un fichier

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par mathieu
    utilise un autre SGBDR alors,
    Impossible, il s'agît d'un choix d'entreprise suite à une migration de la compta. C'est le soft de compta qui impose Sql Serveur....

    Ben je vois que deux solutions sérieuses et "non bricolages" :

    * changement de license Sql pour avoir des connections illimitées
    * développer l'intranet en Java

    Merci beaucoup

  11. #11
    Expert éminent
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 501
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 501
    Points : 6 086
    Points
    6 086
    Par défaut
    10 connexions simultanées pour 80 personnes c'est gérable au pire php va attendre car dans SQL Server il me semble qu'il y a la gestion de pool de connexion. En gros tu ouvres 10 connexions en même temps et tu donnes, tu relaches de suite pour quelqu'un d'autre qui était en attente. Je pense qu'il faut pas se prendre la tête de suite avec ça concernant SQLServer. La connexion reste ouverte le temps de parcour du script a toi de bien coder pour pas qu'elle reste ouverte dans des zones inutiles.
    Tu viens du monde de java tu devrais savoir que 80 personnes en même doit pas faire 80 connexions au server sql . Donc de là tu peux créer des objets souvent demandé en session partagé par tous le monde au lieu d'en créer pour chaque utilisateur. C'est la technique de "la griffe du loup"

Discussions similaires

  1. [POO] Singleton et changement de page
    Par RR instinct dans le forum Langage
    Réponses: 6
    Dernier message: 21/11/2006, 06h58
  2. [POO] héritage en php
    Par zana74 dans le forum Langage
    Réponses: 3
    Dernier message: 09/08/2006, 10h50
  3. [POO] Site en PHP 5
    Par emstar dans le forum Langage
    Réponses: 8
    Dernier message: 11/04/2006, 15h36
  4. [POO] bug? de php
    Par XtofRoland dans le forum Langage
    Réponses: 11
    Dernier message: 21/02/2006, 15h54
  5. [POO] Question class php=>javascript
    Par jeff_! dans le forum Langage
    Réponses: 4
    Dernier message: 05/01/2006, 16h10

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