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

PHP & Base de données Discussion :

Classe database + connexion multiple + principe mal compris [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut Classe database + connexion multiple + principe mal compris
    Bonjour,

    Pour simplifier mon code, j'ai créé une classe pour gérer mes connexions avec une base de donnée MySQL. Dans le constructeur de cette classe, je me connecte à la base de données .
    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
     
    class MySQLDB
    {
       //...
     
       /* Class constructor */
       function MySQLDB(){
          /* Make connection to database */
          $this->connection = mysql_connect(DB_SERVER, DB_USER, DB_PASS) or die(mysql_error());
          mysql_select_db(DB_NAME, $this->connection) or die(mysql_error());
     
          //...
          }
       }
    };
     
    /* Create database connection */
    $database = new MySQLDB;
    Tout fonctionne très bien! Mais je me demande... Lorsque j'ai besoin de récupérer des informations de ma base de données, j'inclus mon fichier db.php en utilisant include_once. Donc si je comprends bien comment php s'y prend... lorsqu'il va inclure le fichier il va me créer un objet database qui va se connecter à la base de données. Comme j'utilise include_once et non pas include, il n'incluera qu'une seule fois ce fichier ... Oui mais une seule fois pour tous les utilisateurs ou juste pour l'utilisateur en cours? Qu'entend-on par utilisateur en cours? L'utilisateur de le session courante? Que se passe-t-il si j'ai 1500 utilisateurs qui demande une page contenant cette include_once(db.php)? Mon script va essayer de créer 1500 connexions à ma base de données? Cela ne fonctionnera pas...
    Enfin y-a-t-il possibilité d'avoir un destructeur dans des classes php? Quand est-ce que ma connexion à la base de données va être fermée, je n'appelle jamais mysql_close?
    Je pense au final que l'objet $database est le même pour tous les utilisateurs... C'est une sorte de singleton (même s'il n'est pas programmé comme tel!). Quelqu'un pourrait-il m'expliquer comment cela fonctionne svp ?
    Le mieux serait quand même un multiton avec un destructeur.. mais je ne vois pas bien quand déclencher ce destructeur! Très flou tout ça

    Cordialement,
    Rodrigue

  2. #2
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    Comme j'utilise include_once et non pas include, il n'incluera qu'une seule fois ce fichier ... Oui mais une seule fois pour tous les utilisateurs ou juste pour l'utilisateur en cours? Qu'entend-on par utilisateur en cours? L'utilisateur de le session courante?
    Comme php est un langage de script interprété et pas une application comme on peut l'entendre en winforms, le script vas être executé à chaque hit.
    Il faut bien différencier la notion d'utilisateur en cours, d'execution en cours. Un utilisateur peut avoir une vie sur plusieurs execution de scripts successive.
    Une execution de script vas d'un point A, jusqu'à un point B et c'est fini.
    Ce qui n'est absolument pas comme un Webservice.
    Qui vas bien aller d'un point A à un point B, mais aussi pouvoir aller à un point C, se mettre en pause ou faire un tas d'autre chose.

    Que se passe-t-il si j'ai 1500 utilisateurs qui demande une page contenant cette include_once(db.php)? Mon script va essayer de créer 1500 connexions à ma base de données? Cela ne fonctionnera pas...
    Sisi sa fonctionnera : )

    Enfin y-a-t-il possibilité d'avoir un destructeur dans des classes php? Quand est-ce que ma connexion à la base de données va être fermée, je n'appelle jamais mysql_close?
    A la vu de ton code je dirais que tu utilises php4, qui ne dispose pas encore des mots clés __construct et __destruct, qui tu l'auras compris sont les constructeurs/destructeurs de PHP.
    Mais pour en revenir à ta question, les objets sont tous détruits par PHP à la fin du script.
    Les ressources provenant des connexions mysql_* ont une particularité supplémentaire qu'elles sont automatiquement fermées à la fin du script.

    En PHP5, tu aurais pu le faire intervenir au niveau du destructeur.


    Je pense au final que l'objet $database est le même pour tous les utilisateurs...
    Non, chaque script créé son propre objet.

    C'est une sorte de singleton (même s'il n'est pas programmé comme tel!). Quelqu'un pourrait-il m'expliquer comment cela fonctionne svp ?
    Au niveau PHP, se définitivement pas le cas. Maintenant je n'irai pas jusqu'à dire que les fonctions mysql_* ne dispose de quelques optimisations pour gérer cela comme tel, mais j'en sais bien peu à ce sujet.

    Le mieux serait quand même un multiton avec un destructeur.. mais je ne vois pas bien quand déclencher ce destructeur!
    en PHP4, je ne pense pas qu'il y ai de solution adéquat, car la notion de destructeur n'existe pas.

    en esperant t'aider un peu.

    bbye

  3. #3
    Membre habitué Avatar de Rodrigue
    Inscrit en
    Août 2002
    Messages
    487
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 487
    Points : 157
    Points
    157
    Par défaut
    D'accord j'ai compris. Il n'y a pas de pause, rien n'est gardé en mémoire... A chaque fois, il va me créer mon objet, l'utiliser puis le détruire.

    Merci !

  4. #4
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Oui tout à fait.
    Après si tu souhaites garder des informations d'un script à un autre, il faut utiliser le système de session.
    Et c'est la qu'apparait la notion d'utilisateur.

    bbye

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C++]Code mal compris
    Par fafa139 dans le forum MFC
    Réponses: 5
    Dernier message: 11/05/2006, 14h51
  2. [C++]Code mal compris
    Par fafa139 dans le forum C++
    Réponses: 5
    Dernier message: 11/05/2006, 14h51
  3. [VB.NET]Connexions multiples pour un même processus.
    Par leSeb dans le forum Windows Forms
    Réponses: 16
    Dernier message: 14/03/2006, 10h53
  4. [DataBase]Connexion a une base de données.
    Par GETah dans le forum JDBC
    Réponses: 3
    Dernier message: 19/04/2005, 18h47

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