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 :

Créer un singleton global à l'application.


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 966
    Par défaut Créer un singleton global à l'application.
    Bonjour,

    Je voudrais créer un singleton dont l'instance serait unique dans toute l'application. Malheureusement, il semble que l'instance créée par ma méthode get_instance ne dure que le temps de l'exécution du script. Prenons l'exemple ci dessous :
    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
    <?php
    	class SingletonCompteur {
    		private static $instance;
     
    		private $compteur;
     
    		private function __construct() {
    			$this->compteur = 0;
    		}
     
    		public static function get_instance() {
    			if(!isset(self::$instance)) {
    				self::$instance = new SingletonCompteur();
    			}
    			return self::$instance;
    		}
     
    		public function get_valeur() {
    			$this->compteur = $this->compteur + 1;
    			return $this->compteur;
    		}
    	}
     
    	echo SingletonCompteur::get_instance()->get_valeur();
    	echo '<br />';
    	echo SingletonCompteur::get_instance()->get_valeur();
    ?>
    Chaque appel à cet page produit le résultat "1 2", et non "1 2" puis "3 4" etc. comme je l'espérais.

    J'ai pensé à utiliser $_SESSION mais il y aurait alors une instance du Singleton par utilisateur.

    Hors j'aimerais utiliser ces singletons pour effectuer des traitements lourds à effectuer au lancement du serveur et pas à chaque chargement de page.

    Savez vous comment s'y prendre?

    D'avance merci,

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    La notion d'application en PHP n'existe pas. Chaque script est une "application" indépendante qui s'exécute et meurt en rendant son résultat.

    Tu peux te servir des sessions pour passer des variables d'un script à un autre, ces sessions étant liées à un utilisateur.

    Si tu veux des variables globales à tous tes utilisateurs, tu peux te servir de fichiers simples pour créer un système de session commune. Il peut par contre se poser un problème en cas d'accès concurrents à ce fichier commun. Peut-être une réponse à ce problème du côté de flock().

  3. #3
    Membre chevronné Avatar de guigo
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    612
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 612
    Par défaut
    tu peux aussi creer une variable $cpt n'appartenant pas ta class

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    $Cpt=0;
          $Cpt=get_valeur($Cpt);
    	echo SingletonCompteur::get_instance()->$Cpt;
    	echo '<br />';
    	echo SingletonCompteur::get_instance()->$Cpt++
     
     
    public function get_valeur($Cpt) {
    			$this->compteur = $Cpt+ 1;
    			return $this->compteur;
    }

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    966
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 966
    Par défaut
    Merci d'avoir répondu.

    @ guigo : En quoi le fait de mettre une variable en dehors d'une classe me permettra-t-il de la partager entre utilisateurs?

    @ Petibidon : J'ai un doute au sujet de l'utilisation d'un fichier. Certaines des données que j'ai l'intention de stocker sont des connections à des bases de données, ce ne sont pas vraiment des objets persistant à stocker sur disque. De plus, mon objectif est d'améliorer les performances. Multiplier les accès disques et les synchronisations risque de faire plus de mal que de bien.

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    A ce que je comprends de ton objectif : Pour ce qui est de connexions aux DB, tu peux toujours te tourner vers les connexions persistantes, qui ont leurs qualités et leurs défauts.

    A lire : http://www.php.net/manual/fr/feature...onnections.php

    Sinon pour ce qui est de définir des variables communes, là tu n'as pas réellement le choix. Fichier ou DB.

    j'aimerais utiliser ces singletons pour effectuer des traitements lourds à effectuer au lancement du serveur et pas à chaque chargement de page.
    Comme tous les scripts sont des "entités" indépendantes, un "lancement de serveur" n'a pas de sens. Si tu as des traitements lourds à faire, il est peut être préférable de créer un script uniquement destiné à ces traitements et le lancer selon certaines conditions (création d'une session utilisateur, tâche CRON indépendante...)

Discussions similaires

  1. [C#] Comment créer une variable globale?
    Par FraktaL dans le forum Windows Forms
    Réponses: 8
    Dernier message: 10/05/2017, 15h10
  2. Créer un install d'une application PHP
    Par sami_c dans le forum Zend
    Réponses: 5
    Dernier message: 12/02/2013, 10h48
  3. Réponses: 6
    Dernier message: 02/08/2006, 17h52
  4. [VB6]Créer l'executable de mon application
    Par ahouba dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 31/05/2006, 20h04
  5. Créer un mail dans une application
    Par Cedced dans le forum Windows
    Réponses: 1
    Dernier message: 03/10/2005, 12h35

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