Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fermer une connexion avec pdo

$pdo = null;... ou pas ?

Sujet résolu
    6 février 2011 à 14:37:28

    Bonjour,

    Je suis sur un petit hébergeur amateur qui limite ma base de données à 3 connexions simultanés et ça ne tient pas le coup quand j'ai une dizaines de visiteurs, pourtant d'après le support ça devrait tenir beaucoup plus. On me dit de couper la connexion tôt dans mes script et c'est pourtant ce que je fait, ou du moins ce que je pense faire avec :

    $pdo = null;

    J'ai lut qu'avec pdo c'est comme cela que l'on coupe la connexion (au lieu de mysqli_close()).

    Mais après réflexion, tout ce que ça fait c'est détruire l'objet... donc est-ce que la class PDO possède une methode _destruct dans laquelle elle coupe la connexion ou est-ce que détruire l'objet ne sert à rien ?

    Merci d'avance pour vos réponses.
    • Partager sur Facebook
    • Partager sur Twitter
      6 février 2011 à 14:56:47

      je te conseille vivement de lire le tutoriel de mateo sur les connection avec pdo :
      http://www.siteduzero.com/tutoriel-3-1 [...] -donnees.html

      la methode a apellé se nomme closeCursor
      • Partager sur Facebook
      • Partager sur Twitter
        6 février 2011 à 15:20:59

        Merci pour ta réponse, mais il me semblais que close_cursor() permettait juste de supprimer de la mémoire les données d'une requête pour pouvoir en faire une nouvelle.

        En fait j'en suis quasiment sûr, car si la connexion était fermé ce serait impossible de refaire une requête après un close_cursor(). ;)

        D'autres avis ?
        • Partager sur Facebook
        • Partager sur Twitter
          6 février 2011 à 15:23:02

          Cela libère la mémoire pour les variables qui contiennent les requêtes mais aussi pour la variable contenant la connexion ;)
          • Partager sur Facebook
          • Partager sur Twitter
            6 février 2011 à 15:24:31

            Citation : Skelettedemars

            Cela libère la mémoire pour les variables qui contiennent les requêtes mais aussi pour la variable contenant la connexion ;)



            Oui mais la connexion n'est pas coupé pour autant, puisque l'on peux refaire une requête après.

            (j'ai édité mon message juste avant que tu poste, t'a peut-être pas vu sorry :) )
            • Partager sur Facebook
            • Partager sur Twitter
              6 février 2011 à 15:25:26

              Tu utilises la méthode close_cursor pour quelle variable ? Ta requête, ou ta connexion ?

              Peux-tu donner un petit bout de code plz ?
              • Partager sur Facebook
              • Partager sur Twitter
                6 février 2011 à 15:28:29

                Ah d'accord j'ai mal lut ton message. Excuse.

                Donc ça s'utilise sur les requêtes et directement sur l'objet PDO c'est bien ça ?

                C'est comme ceci qu'il faut procéder ?
                <?php
                $pdo = new PDO(....);
                
                // fermeture de la connexion
                $pdo->closeCursor();
                
                // edit : ça ne peux pas fonctionner, voir le bas de mon message
                


                Mais là encore j'ai un doute, tu dit que ça efface seulement les variables de l'objet, donc ça ne coupe pas la connexion. :o

                Edit : j'avais entendu dire que la fonction mysqli_close() lançais une requête pour stopper la session, enfin la connexion, il faudrait quelque chose d'identique en pdo (ça doit bien exister).

                rédit : closeCursor() n'existe pas dans la class PDO, seulement dans PDOStatments, donc c'est sûr ce n'est pas ça. Cette methode ne peux pas fermer une connexion.
                • Partager sur Facebook
                • Partager sur Twitter
                  6 février 2011 à 16:37:27

                  Peux-tu effectuer une requête après avoir fait closecursor ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 février 2011 à 19:30:32

                    Pourtant j'en fait.

                    Test tu verras par toi-même, tu peux tester avec ça :
                    <?php
                    
                    $pdo = new PDO('tes paramètres');
                    
                    
                    $req = $pdo->query('select 1;');
                    echo $req->fetchColumn();
                    $req->closeCursor();
                    
                    $req = $pdo->query('select 2;');
                    echo $req->fetchColumn();
                    $req->closeCursor();
                    
                    // affiche 12
                    


                    J'ai fait un tour sur la doc de PDO et d'après ce que je vois il n'y a aucune raison pour que closeCursor faire la connexion à mysql. Vous devez confondre avec autre chose.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 février 2011 à 19:52:40

                      closeCursor() ne va pas fermer ta connexion. Ce n'est pas la méthode à utiliser.

                      Moi, j'ai toujours fait $pdo = null; mais c'est à vérifier si c'est la méthode la plus propre.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 février 2011 à 19:56:13

                        Citation : Marc15

                        closeCursor() ne va pas fermer ta connexion. Ce n'est pas la méthode à utiliser.


                        Oui c'est ce que j'essaie de faire comprendre à ceux qui ont essayés (d'ailleurs merci quand même, j'apprécie toutes ces réponses :) ) de m'aider depuis le début, closeCursor ne ferme pas la connexion.

                        Citation : Marc15


                        Moi, j'ai toujours fait $pdo = null; mais c'est à vérifier si c'est la méthode la plus propre.


                        C'est ce que j'essaie de savoir. ^^
                        • Partager sur Facebook
                        • Partager sur Twitter
                          6 février 2011 à 20:15:49

                          nan mais quand tu fais pdo = null tu detruis juste la reference vers l'objet, si tu veux detruire l'objet pdo tu devrais normalement faire cela pour tout les variable que tu as créer a partir de ton objet pdo.

                          le plus simple est sans doute d'utiliser un destructeur, pdo est php5 il me semble donc il doit y avoir un.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 février 2011 à 20:22:16

                            La classe PDO n'en ai pas équipé d'après la doc.

                            Mais de toute faon, éclaircissons déjà ce point si vous le voulez bien : En quoi supprimer un objet PDO fait que la connexion à mysql se coupe ? Il faut bien donner un ordre à mysql pour fermer la connexion non ?
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 février 2011 à 20:26:10

                              avec pdo la connexion ne s'etablit de la meme facon que avec mysql. la connection n'est reellement etablie qu'au moment de l'execution de ta requete, des les données relatif au traitement de ta requete traitée, la connection se ferme sans action de ta part en theorie.

                              les seules choses qui pourrait faire tourner la connection plus longtemps sont des erreur SQL ou l'utilisation d'instruction particuliere tel que les commit !
                              • Partager sur Facebook
                              • Partager sur Twitter
                                6 février 2011 à 20:29:31

                                D'accord. :)
                                Donc si j'ai bien compris, pdo se "reconnecte" a chaque requête ? Ça pourrait expliquer mon problème de connexions simultanés ?

                                Pour info j'utilisais l'api mysqli il y a encore peu de temps et je n'avais pas ce soucis de connexion simultanés. (mon nombre de visiteurs n'a pas augmenté entre temps)
                                Mais je n'ai pas conservé mes scripts sous cette api... j'espère ne pas devoir tout refaire.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  6 février 2011 à 20:33:03

                                  et bien je crois pdo gere une seul connection quand tu fais plusieurs requete dans le meme script quand meme mais pas sur du tout
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    6 février 2011 à 20:37:11

                                    D'après mes recherches, $pdo = null; ou simplement attendre la fin du script (la variabl est détruite) sont les deux bonnes méthodes.

                                    PHP est un langage dynamique, donc les objets sans référence sont suprimmés automatiquement.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      6 février 2011 à 21:01:15

                                      Citation : luckyboss1

                                      et bien je crois pdo gere une seul connection quand tu fais plusieurs requete dans le meme script


                                      Est-ce que ce fonctionnement peux changer en fonction de la configuration du serveur ? Si ça ce trouve c'est un problème du côté de mon hébergeur.

                                      Citation : Marc15

                                      ou simplement attendre la fin du script


                                      C'est une solution qui ne m'arrange pas (qui n'arrange personne en fait je suppose :p ) car je fait mes requ6etes très tôt dans mes scripts donc laisser la connexion ouverte tout le reste du traitement pour rien c'est pas terrible.


                                      Je vais recontacter mon hébergeur pour leur demander si c'est un problème de leur configuration... je vais peut-6etre me faire taper mais je tente. :-°
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        6 février 2011 à 21:21:09

                                        tu es sur que tu ne fait pas n'importe quoi dans une requete sql plutot en declarant un mauvais commit par exemple ?

                                        normalement trois connexion simultanément, c'est largement suffisant pour des petites structure jusqu'a quelques centaines par jour tranquillement
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          6 février 2011 à 21:28:45

                                          Par jour ? J'ai facilement 400 visiteurs unique voir plus certains jours. je disais une dizaine mais en même temps (en heure de pointe, le midi et le soir). Je précise que je compte mes visiteurs sur les 5 dernière minutes, comme sur les forum phpbb, ce n'est pas une dizaine "en même temps". En tout cas ça fonctionnais sans souci quand j'utilisais mysqli.

                                          Pour commit je ne vois pas trop ce que c'est, si c'est en rapport avec les transactions, je n'en n'utilise pas.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            6 février 2011 à 21:50:43

                                            c'est en effet avec les transactions donc ok pas de soucis a ce niveau la.

                                            3 connexion simultané avec 3 connexion simultané c'est en effet limite. c'est ki ton hebergeur ?
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              6 février 2011 à 21:53:02

                                              Citation : luckyboss1

                                              normalement trois connexion simultanément, c'est largement suffisant pour des petites structure jusqu'a quelques centaines par jour tranquillement



                                              Avec une architecture standard (lighttpd + 8 procs php en fastcgi avec une connection mysql chaque) sur un serveur entrée de gamme (genre dedibox), on sert facilement 200 pages/s...

                                              > Je suis sur un petit hébergeur amateur qui limite ma base de données à 3 connexions simultanés
                                              > et ça ne tient pas le coup quand j'ai une dizaines de visiteurs

                                              Je penche pour les explications suivantes :

                                              - PHP/SQL pas du tout optimisé, donc temps de pages énormes (genre 0.2s) voire monstrueux (1s)
                                              - mauvaise configuration d'apache/php (output buffering désactivé)

                                              Difficile à dire sans un peu de profiling...
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                6 février 2011 à 22:03:00

                                                Citation : _Boris

                                                Citation : Marc15

                                                ou simplement attendre la fin du script


                                                C'est une solution qui ne m'arrange pas (qui n'arrange personne en fait je suppose :p ) car je fait mes requ6etes très tôt dans mes scripts donc laisser la connexion ouverte tout le reste du traitement pour rien c'est pas terrible.


                                                Donc ce cas-là, $pdo = null;... :-°

                                                Si tu le fais déjà, ton problème vient d'ailleurs.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  7 février 2011 à 13:27:37

                                                  Alors j'ai repassé mes scripts sous mysqli et je n'ai plus de problèmes. J'ai recontacté l'hébergeur et je vais attendre une réponse... :/

                                                  @lucky : c'est un particulier qui possède un dédié, il héberge des sites gratuitement à condition que ce soient des projets sérieux. Demande par mp si tu veux le nom (je n'ai pas envie de faire de la sale pub, défois que le souci ne vienne pas de lui.. :) ).

                                                  @lord : le chargement des pages n'est pas spécialement rapide, mais je n'ai aucun lags. Par contre je ne compte pas le temps de chargement, je vais ajouter un petit compteur pour voir.
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    7 février 2011 à 13:52:17

                                                    il pourrait quand meme booster le nombre de connexion simultané à 5 ou 10 pour pas avoir de soucis
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      22 décembre 2012 à 5:19:02

                                                      Salut à tous !

                                                      Désolé de remonter un post vieux de presque 1an, mais après avoir cherché la réponse à cette question pendant au moins 1/4 d'heure sur Google, j'ai fini par avoir la solution en lisant ce topic et je me suis dit que quelques explications sur le sujet pourrait en aider plus d'un ;)

                                                      Voici un petit exemple :

                                                      <?php
                                                      // Connexion à la BDD
                                                      $exemple = new PDO(....);
                                                      
                                                      // On effectue nos opérations sur la BDD
                                                      $essai = $exemple->query(....);
                                                      echo $essai->fetchColumn();
                                                      
                                                      // On oubli pas de  fermer le curseur d'analyse des résultats après l'utilisation de fetchColumn()
                                                      $essai->closeCursor();
                                                      
                                                      // Déconnexion de la BDD
                                                      unset( $exemple );
                                                      ?>
                                                      


                                                      D'après moi, l'utilisation de l'objet PDO ne diffère pas d'un autre objet programmé en PHP5, le destructeur de l'objet est donc automatiquement appelé lors de l'utilisation de la fonction unset().

                                                      A partir de la, les connexions qui ont été ouvertes par l'objet en question, seront donc fermées ^^

                                                      Pensez à mettre se sujet en résolu si la réponse vous convient ;)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Fermer une connexion avec pdo

                                                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                      • Editeur
                                                      • Markdown