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 :

Message hébergeur trop de connexions "TIME _WAIT" sur le serveur SQL [PDO]


Sujet :

PHP & Base de données

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 33
    Par défaut Message hébergeur trop de connexions "TIME _WAIT" sur le serveur SQL
    Bonjour,
    Mon hébergeur m'informe :
    Nous avons toujours beaucoup de connexions en "TIME _WAIT" (3068) sur le serveur SQL.
    netstat | grep TIME_WAIT | wc -l
    3068

    Apparemment les connexions entre le serveur Web et le serveur SQL resteraient ouvertes.
    J'ai créé deux fonctions pour mes scripts une d'écritures et une de lecture des bases SQL, ces fonctions sont appelées très régulièrement par les utilisateurs, une fois toutes les 5 secondes environ, et j'ai à peu prêt 400 utilisateurs en simultané.

    Les fonctions de lectures et d'écritures ferment pourtant la connexion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
      $bdd = new PDO ('mysql:host=IP;dbname='.$base.';charset=latin1;', 'util', 'pass');
      $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      ......
      $req->execute(array('search' => $lgn[0]));
      .......
      $req->closeCursor();
     
      ......
      //fermeture de la connexion
      $bdd=null;
      unset($bdd);
    Le problème vient-il de mon code ?

    Merci de votre aide.

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 502
    Par défaut
    Votre hébergeur acceptent combien de connexions simultané ? première question à vérifier.
    Par exemple OVH en version pro c'est 125.

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 33
    Par défaut
    Je n'ai pas vraiment de problème de ce coté,
    Ce qui m'inquiète c'est qu'il me dise qu'il y a 3068 connexions ouvertes (time_wait), si je comprend ce qu'il me dit et que d'après mes estimations je pourrais en avoir au maximum 600 en supposant que tous les utilisateurs fasse une requête au même moment.
    Je ferme pourtant les connexions aux bases à la fin de chaque requête, soit je n'ai pas compris son message, soit je ne ferme pas correctement l'accès au base, ....

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 502
    Par défaut
    Il ne faut pas aussi mettre à null le statment ?


  5. #5
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 33
    Par défaut
    Je vais tenté.
    Merci

  6. #6
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    D'après la doc, il semble que MaitrePylos ait mis le doigt sur un point intéressant
    La connexion est active tant que l'objet PDO l'est. Pour clore la connexion, vous devez détruire l'objet en vous assurant que toutes ses références sont effacées. Vous pouvez faire cela en assignant NULL à la variable gérant l'objet. Si vous ne le faites pas explicitement, PHP fermera automatiquement la connexion lorsque le script arrivera à la fin.

    Note: S'il existe encore d'autres références à cette instance PDO (par exemple, à partir d'une instance PDOStatement ou d'autres variables référençant la même instance PDO), celles-ci doivent également être supprimées (par exemple, en affectant NULL à la variable qui référence le PDOStatement).
    Cela dit, dans la plupart des cas, on ouvre une fois la connexion en début de script. A moins que tu ais de longs traitements n'utilisant pas du tout la connexion entre 2 requêtes, ça te coutera probablement moins cher en ressources et en temps de conserver la même connexion pour tout le script.
    C'est comme si tu t'occupais du linge qui est rangé dans un placard : si tu est en train de plier des chemises, tu n'ouvres et fermes pas le porte entre chaque chemise.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  7. #7
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Décembre 2014
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2014
    Messages : 33
    Par défaut
    Bonjour,
    Merci de votre réponse le problème est en effet l'ouverture de la connexion à chaque requête.
    Lorsqu'un utilisateur change de page sur le site je ré-ouvre systématiquement la connexion, comme les changement de pages sont fréquents la connexion n'a pas le temps de se fermer (d'après l'administrateur du serveur)

    A chaque ouverture de page la connexion utilisée est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bdd = new PDO ('mysql:host=IP;dbname='.$base.';charset=latin1;', 'util', 'pass');
    Mon problème ne serait-il pas résolu avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $bdd = new PDO ('mysql:host=IP;dbname='.$base.';charset=latin1;', 'util', 'pass', array(PDO::ATTR_PERSISTENT => true));
    La question que je me pose c'est : la connexion créée devient persistante, si je rappelle la même fonction une deuxième connexion persistante est créée ou comme elle existe déjà elle ne se recréée pas?

    Merci de votre éclairage.

  8. #8
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Par défaut
    Vu la doc, ça pourrait être la solution :
    Les connexions persistantes ne sont pas fermées à la fin du script, mais sont mises en cache et réutilisées lorsqu'un autre script demande une connexion en utilisant les mêmes paramètres. Le cache des connexions persistantes vous permet d'éviter d'établir une nouvelle connexion à chaque fois qu'un script doit accéder à une base de données, rendant l'application web plus rapide.
    Donc logiquement, si ton script de connexion est le même partout, les paramètres sont identiques, donc il va taper dans le cache.

    Cela dit, en général, on évite d'utiliser les connexions persistantes car elles peuvent provoquer tout un tas de problèmes. Notamment par rapport à la taille du pool de connexions : si tu as 16 connexions possibles et qu'un 17e utilisateur se connecte, ça va faire plouf... Il y a aussi le problème de l'état des connexions : si un script plante ou laisse quelque chose d'inachevé, le prochain script qui utilisera cette connexion va prendre la connexion exactement dans l'état (bancal) où elle a été laissée, et dans le pire des cas, la connexion ne sera jamais relâchée et tu te retrouveras avec un élément de moins dans ton pool.

    Donc à tester, mais en prenant un max de précautions.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

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

Discussions similaires

  1. [2012] Message d'erreur à demande de connexion sur un serveur SQL.
    Par dimitri13 dans le forum Administration
    Réponses: 2
    Dernier message: 29/06/2017, 10h23
  2. Réponses: 3
    Dernier message: 30/03/2008, 15h20
  3. Connexion à la base de donnée sur le serveur
    Par abbd dans le forum Windows Forms
    Réponses: 1
    Dernier message: 30/03/2008, 15h16
  4. [connexion base de données access sur un serveur]
    Par t1marlartiste dans le forum Access
    Réponses: 1
    Dernier message: 09/07/2007, 17h23
  5. Voir les connexions actives sur un serveur SQL
    Par ludal dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/11/2006, 11h48

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