Forum Programmation.php Objet static et singloton en php5

Posté par  (site web personnel) .
Étiquettes : aucune
0
4
mai
2005
Bonjour,

Je cherche à savoir s'il est possible de réaliser des objet static singloton en php5

Lorsque je code des objet static en java ou en c#, mes singlotons résidant dans la mémoire de mon serveur d'applications ( Tomcat & IIS) et Je peux récupérer mon instance unique du singloton entre mes différentes classes.

Alors il n'existe pas de serveur d'applications php à proprement parler (enfin je pense)

donc du coup ma question : Est-il possible d'instancier un singloton que l'on pourrait récupérer dans des scripts différents que le script initiateur.

Et plus généralement, Quel est l'étendu du contexte lorsque je suis dans un script ? Puis-je accéder à mes objets déclarés ailleurs...

Ceci étant dans le but de garder un objet static en mémoire afin de charger automatiquement des modifications sur un fichier ou bien réaliser un traitement toutes les 30 seconds sur ce fichier. Les solutions de rechargement toutes les 5 minutes ne me conviennent pas


Merci d'avance.
Bozo
  • # porté des variables

    Posté par  . Évalué à 5.

    le singleton est souvent utilisé en php5 grâce au mot clef static notamment.


    Par contre la portée d'une variable d'un objet ou d'une ressource est l'exécution du script lui même.

    Mais tu peux utiliser les mécanismes de mémoires partagés avec les mécanismes IPC.

    De plus tu peux demander à ce qu'un script n'arrête pas son exécution à la fin de la connexion, donc qu'il continue à s'exécuter en mémoire.

    La commande wait permet de faire du timer.

    Tu peux désactiver au niveau du code PHP la notion de timeout d'exécution.

    Donc tu peux faire ce que tu décris, sans utiliser la notion de singleton j'avais écris une mailing list avec un système de spool et de régulation d'envoi en PHP, ça marchait super.
    • [^] # Re: porté des variables

      Posté par  (site web personnel) . Évalué à 1.

      et tu penses qu'avec les IPC, je pourrais partager la référence vers mon objet static entre script ?

      Merci beaucoup pour ta réponse
      Bozo
      • [^] # Re: porté des variables

        Posté par  . Évalué à 4.

        oui en gros tu fais shm_get_var pour récupérer ton instance, pour le coups tu peux communiquer avec des applications en C ou en Perl.

        Par contre est-ce que c'est une copie ou une référence qui est passé, je ne sais pas.

        En partant dans le cas qui ne nous arrange pas, si c'est une copie, il va falloir que tu utilises des sémaphores dans les méthodes de ton objet, et que tu mettes à jour l'objet partagé quand tu le modifies avec shm_put_var
        • [^] # Re: porté des variables

          Posté par  . Évalué à 2.

          Pardonnez mon intrusion dans cette discussion...
          Mais c'est bigrement intéressant ce que vous racontez !
          Une question me brûle les lèvres : "A quoi ça sert ?". J'ai envie de croire que ça permettrait - idéalement - de coder en php une sorte de serveur par client (connexion d'un navigateur) qui conserverait en mémoire son contexte d'une requête à une autre.
          Si c'est ça, j'aimerai bien obtenir de l'un d'entre vous au choix :
          soit des explications plus claires (avec un exemple, ce serait le pied), soit des liens clairs et explicites vers le sujet (j'ai vaguement cherché, mais je n'ai rien obtenu de mon niveau ; en clair, je n'ai rien compris à ce que j'ai lu !).
          Si j'ai mal interprété vos propos, oubliez ce commentaire, sinon, merci à vous d'avoir suscité mon intérêt pour cette problématique qui me sort de mon ordinaire !
    • [^] # Re: porté des variables

      Posté par  . Évalué à 1.

      >De plus tu peux demander à ce qu'un script n'arrête pas son exécution à la fin de la connexion, donc qu'il continue à s'exécuter en mémoire.

      on peut faire celà ?
      ca m'interresse, vous avez des info a ce propos ? quelle commande ?
      merci.
      • [^] # Re: porté des variables

        Posté par  . Évalué à 2.

        ignore_user_abort(true)

        demande à php à la fin de la connexion d'ignorer cette déconnexion et de rester dans l'état actif

        set_time_limit ( 0 ), enlève ton timeout pour l'exécution

        sleep ( 3 ) demande comme un wait en C de se mettre en attente au niveau système pendant 3 secondes.

        C'est ce qui est un peu génial avec PHP, c'est que tu peux faire du système, dans certains cas, les fonctions ne sont pas disponibles sous windows, mais franchement ce n'est pas grave.
  • # Avec les sessions

    Posté par  . Évalué à 1.

    tu peux coder un truc comme ça :
    class Singleton
    {
              static function new( $name )
              {
                          if ( ! $_SESSION['singleton'][$name] ) 
                          {
                                         $_SESSION['singleton'][$name] = new $name();
                         }
                          
                          return $_SESSION['singleton'][$name];
               }
    }
    
    et aussi n'oublie pas le session_start();
    • [^] # Re: Avec les sessions

      Posté par  (site web personnel) . Évalué à 0.

      enfin ca revient à sérialiser son objet en session....

      Mais le problème s'est que si mon objet contient une reférence sur une connection BDD ou une réference vers un fichier, ca ne va pas survivre à la sérialisation.....

      Si je ressors mon objet 1 heure apres ma connection elle va etre dead :D


      D'où l'interet de garder l'objet en vie, mais merci qd meme
      • [^] # Re: Avec les sessions

        Posté par  . Évalué à 2.

        Les sessions ne sont valable que dans le cadre de la session, et comme il y a sérialisation, les ressources ???

        Pour ce qui est des ressources en PHP, les connexions persistantes, si il n'y a pas d'activité, il y aura un timeout je pense (à vérifier), par contre si tu as un descripteur de fichier, là tu peux le garder ouvert en permanence si le script s'exécute en permanence et en jouant avec wait.

        En fait ce qui serait génial, c'est de faire une classe générique utilisant les différents appels systèmes pour faire un singleton inter instance d'exécution, comme çà il n'y aurais plus qu'à l'hériter pour le réutiliser.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.