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 :

error max_user_connections boucle requêtes


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 22
    Points
    22
    Par défaut error max_user_connections boucle requêtes
    Bonjour,

    je développe mon site web, et je rencontre une erreur qui me bloque... Il s'agit de max_user_connections.

    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1203 User ********** already has more than 'max_user_connections' active connections in /storage/ssd5/226/16889226/public_html/segments_liste.php:145
    Stack trace: #0 /storage/ssd5/226/16889226/public_html/segments_liste.php(145): PDOStatement->execute() #1 /storage/ssd5/226/16889226/public_html/index.php(296): include('/storage/ssd5/2...') #2 {main} thrown in /storage/ssd5/226/16889226/public_html/segments_liste.php on line 145
    Après des recherches sur le web, j'ai compris qu'ils s'agissaient de requêtes lentes, en cours d'exécution.
    Je pensais que c'était un nombre de visiteurs connectés, mais je suis le seul à être sur le site actuellement, je n'ai partagé le lien à personne.

    Voila la liste show PROCESSLIST
    Nom : process_list.png
Affichages : 127
Taille : 94,9 Ko
    Ils disparaissent progressivement en 30 secondes, 1 minute.


    La ligne 145 est la ligne $nb_seg_par_liste_prep->execute();

    J'ai amélioré le code en mettant une requête préparée plutôt qu'une requête classique et en rajoutant $nb_seg_par_liste_prep = null; mais rien n'y fait, l'erreur me bloque.
    Savez-vous d'où cela peut venir ?
    Dois-je modifier la config de la bdd ? sachant que c'est un hébergeur gratuit et que je ne peux pas modifier certains valeurs comme max_user_connections qui est à 30.

    Site : https://defis-de-cyclogrimpeurs.000w....com/index.php
    Hébergeur : 000webhostapp.com
    BDD : Serveur : Localhost via UNIX socket
    Type de serveur : MariaDB
    Connexion au serveur : SSL n'est pas utilisé Documentation
    Version du serveur : 10.3.16-MariaDB - MariaDB Server
    Version du protocole : 10
    Utilisateur : ********
    Jeu de caractères du serveur : UTF-8 Unicode (utf8)
    Serveur Web
    Apache
    Version du client de base de données : libmysql - mysqlnd 5.0.12-dev - 20150407 - $Id: 7cc7cc96e675f6d72e5cf0f267f48e167c2abb23 $
    Extension PHP : mysqliDocumentation curlDocumentation mbstringDocumentation
    Version de PHP : 7.3.23

    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
    $nb_seg_par_liste_sql = "SELECT s.segment_id, s.seg_liste, r.id_membre_demandeur, r.segment_id
    			FROM strava_segments s 
    			LEFT JOIN ".$bdd_strava_resultats." r 
    			ON s.segment_id = r.segment_id
    			WHERE s.seg_liste = :seg_liste AND id_membre_demandeur=".$_SESSION['id_membre_strava']."
    			GROUP BY r.segment_id";
     
    $nb_seg_par_liste_prep = $bdd->prepare($nb_seg_par_liste_sql);
     
    while ($listes_data = $listes_req->fetch()) {
    		$nb_seg_par_liste_prep->bindParam(':seg_liste', $listes_data['liste_id']);
    		$nb_seg_par_liste_prep->execute();
    		$nb_seg_par_liste_count = $nb_seg_par_liste_prep->rowCount();
    		}
    $nb_seg_par_liste_prep = null;
    $listes_req = null;
    Je vous remercie par avance,
    bon weekend

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 043
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 043
    Points : 8 075
    Points
    8 075
    Billets dans le blog
    17
    Par défaut
    Utilises-tu des connexions persistantes ?
    Comment gères-tu l'instance $bdd ?

    Tes pages web appellent-elles d'autres pages ? Ou génères-tu des images dynamiquement ? Autre ? (ex. webservices)

    Je ne pense pas que ta requête soit en cause mais ce n'est jamais bon de faire du SQL dans une boucle => Tu devrais pouvoir faire 1 requête unique
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 351
    Points : 42 822
    Points
    42 822
    Par défaut
    Après tes requêtes, fermes-tu la connexion à la base ? sinon la connexion restant ouverte, au bout de 30 requêtes tu as l’erreur vu que tu es limité à 30 requêtes.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Utilises-tu des connexions persistantes ?
    non, je ne crois pas, voila mon code de connexion à la bdd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    try {$bdd = new PDO('mysql:host='.$adresse.';dbname='.$database.';charset=utf8mb4', $user, $motdepasse, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));}
    catch (Exception $e) {die('Erreur : ' . $e->getMessage());}

    Citation Envoyé par Séb. Voir le message
    Comment gères-tu l'instance $bdd ?
    désolé, je ne comprends pas. je la ferme à la fin de la page avec $bdd = null;


    Citation Envoyé par Séb. Voir le message
    Tes pages web appellent-elles d'autres pages ? Ou génères-tu des images dynamiquement ? Autre ? (ex. webservices)
    il y a des includes oui. pas d'image dynamique, je ne sais pas ce que c'est.


    Citation Envoyé par Séb. Voir le message
    Je ne pense pas que ta requête soit en cause mais ce n'est jamais bon de faire du SQL dans une boucle => Tu devrais pouvoir faire 1 requête unique
    je vais voir si je peux améliorer mes requêtes.

    Ce qui est étrange, c'est que le site fonctionnait très bien.
    Puis il a été supprimé car j'ai "oublié" de me connecter au gestionnaire pendant 1 mois...
    Heureusement, j'avais gardé une copie... sauf de la base de donnée récente donc j'ai perdu pas mal de données...
    Et depuis que je l'ai recréé, j'ai cette erreur. Bizarre

    Je te remercie pour ton aide.




    Citation Envoyé par chrtophe Voir le message
    Après tes requêtes, fermes-tu la connexion à la base ? sinon la connexion restant ouverte, au bout de 30 requêtes tu as l’erreur vu que tu es limité à 30 requêtes.
    Je ferme la connexion en fin de page :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $bdd = null;
    //$bdd->close();		// fermeture session mysqli
    ?>
     
    	</body>
    </html>
    Faudrait-il que je ferme puis réouvre après chaque requêtes ?
    Effectivement, si j'ai une boucle avec plus de 30 requêtes, ca va me bloquer à chaque fois.
    Merci pour ton aide

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 043
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 043
    Points : 8 075
    Points
    8 075
    Billets dans le blog
    17
    Par défaut
    non, je ne crois pas, voila mon code de connexion à la bdd
    Et ce code de connexion, est-il exécuté 1 seule fois ou bien est-il amené à être exécuté plusieurs fois ? Genre un include() que tu inclus un peu partout.

    Tu utilises peut-être des transactions ?

    Image dynamique : <img src="graph.php"> => Tu exécutes du PHP pour générer une image, il y a plusieurs connexions à ta db pour le chargement d'une même page

    WebService : file_get_contents('https://ton-site.com/ws/getSomething.php') => Tu appelles un WS de ton propre site, plusieurs connexions à ta db pour le chargement d'une même page

    Faudrait-il que je ferme puis réouvre après chaque requêtes ?
    Non, la même connexion est réutilisée pour les requêtes, ça ne devrait pas provoquer ce genre de situation.

    Essaie de faire une page toute simple, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    $host = '...';
    $database = '...';
    $user = '...';
    $password = '...';
    $pdo = new PDO("mysql:host={$host};dbname={$database};charset=utf8mb4", $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);
     
    for ($i = 1; $i <= 50; $i++) {
        $sql = "SELECT ALL {$i}, NOW(6)";
        print_r($pdo->query($sql)->fetch());
    }
    Et regarde comment se comportent les connexions. Si ça ne passe pas tu sauras que le problème ne vient pas de toi.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 380
    Points : 10 410
    Points
    10 410
    Par défaut
    Oui effectivement si tu as des includes avec des fermeture de connexion en bas de chaque page tu multiplies tes connexions -> ne ferme pas manuellement tes connexions, php le fera tout seul. Possible aussi que tu initialises différentes connexions dans différentes pages ou includes, un moyen propre est de faire une classe de connexion statique dont tu te sert pour toutes tes connexions dans toutes tes pages et pages inclues, ainsi tu es certain de ne n'utiliser qu'une connexion tout au long du script.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Essaie de faire une page toute simple, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    $host = '...';
    $database = '...';
    $user = '...';
    $password = '...';
    $pdo = new PDO("mysql:host={$host};dbname={$database};charset=utf8mb4", $user, $password, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    ]);
     
    for ($i = 1; $i <= 50; $i++) {
        $sql = "SELECT ALL {$i}, NOW(6)";
        print_r($pdo->query($sql)->fetch());
    }
    Et regarde comment se comportent les connexions. Si ça ne passe pas tu sauras que le problème ne vient pas de toi.
    Bonjour,

    résultat du test :

    Array ( [1] => 1 [2] => 1 [NOW(6)] => 2021-06-24 16:57:01.878105 [3] => 2021-06-24 16:57:01.878105 ) Array ( [2] => 2 [3] => 2 [NOW(6)] => 2021-06-24 16:57:01.878949 [4] => 2021-06-24 16:57:01.878949 ) Array ( [3] => 3 [4] => 3 [NOW(6)] => 2021-06-24 16:57:01.879718 [5] => 2021-06-24 16:57:01.879718 ) Array ( [4] => 4 [5] => 4 [NOW(6)] => 2021-06-24 16:57:01.880570 [6] => 2021-06-24 16:57:01.880570 ) Array ( [5] => 5 [6] => 5 [NOW(6)] => 2021-06-24 16:57:01.881260 [7] => 2021-06-24 16:57:01.881260 ) Array ( [6] => 6 [7] => 6 [NOW(6)] => 2021-06-24 16:57:01.881968 [8] => 2021-06-24 16:57:01.881968 ) Array ( [7] => 7 [8] => 7 [NOW(6)] => 2021-06-24 16:57:01.882729 [9] => 2021-06-24 16:57:01.882729 ) Array ( [8] => 8 [9] => 8 [NOW(6)] => 2021-06-24 16:57:01.883422 [10] => 2021-06-24 16:57:01.883422 ) Array ( [9] => 9 [10] => 9 [NOW(6)] => 2021-06-24 16:57:01.884071 [11] => 2021-06-24 16:57:01.884071 ) Array ( [10] => 10 [11] => 10 [NOW(6)] => 2021-06-24 16:57:01.884831 [12] => 2021-06-24 16:57:01.884831 ) Array ( [11] => 11 [12] => 11 [NOW(6)] => 2021-06-24 16:57:01.885714 [13] => 2021-06-24 16:57:01.885714 ) Array ( [12] => 12 [13] => 12 [NOW(6)] => 2021-06-24 16:57:01.886322 [14] => 2021-06-24 16:57:01.886322 ) Array ( [13] => 13 [14] => 13 [NOW(6)] => 2021-06-24 16:57:01.887150 [15] => 2021-06-24 16:57:01.887150 ) Array ( [14] => 14 [15] => 14 [NOW(6)] => 2021-06-24 16:57:01.887962 [16] => 2021-06-24 16:57:01.887962 ) Array ( [15] => 15 [16] => 15 [NOW(6)] => 2021-06-24 16:57:01.888661 [17] => 2021-06-24 16:57:01.888661 ) Array ( [16] => 16 [17] => 16 [NOW(6)] => 2021-06-24 16:57:01.889399 [18] => 2021-06-24 16:57:01.889399 ) Array ( [17] => 17 [18] => 17 [NOW(6)] => 2021-06-24 16:57:01.890152 [19] => 2021-06-24 16:57:01.890152 ) Array ( [18] => 18 [19] => 18 [NOW(6)] => 2021-06-24 16:57:01.890905 [20] => 2021-06-24 16:57:01.890905 ) Array ( [19] => 19 [20] => 19 [NOW(6)] => 2021-06-24 16:57:01.891648 [21] => 2021-06-24 16:57:01.891648 ) Array ( [20] => 20 [21] => 20 [NOW(6)] => 2021-06-24 16:57:01.892445 [22] => 2021-06-24 16:57:01.892445 ) Array ( [21] => 21 [22] => 21 [NOW(6)] => 2021-06-24 16:57:01.893205 [23] => 2021-06-24 16:57:01.893205 ) Array ( [22] => 22 [23] => 22 [NOW(6)] => 2021-06-24 16:57:01.894050 [24] => 2021-06-24 16:57:01.894050 ) Array ( [23] => 23 [24] => 23 [NOW(6)] => 2021-06-24 16:57:01.894730 [25] => 2021-06-24 16:57:01.894730 ) Array ( [24] => 24 [25] => 24 [NOW(6)] => 2021-06-24 16:57:01.895342 [26] => 2021-06-24 16:57:01.895342 ) Array ( [25] => 25 [26] => 25 [NOW(6)] => 2021-06-24 16:57:01.896076 [27] => 2021-06-24 16:57:01.896076 ) Array ( [26] => 26 [27] => 26 [NOW(6)] => 2021-06-24 16:57:01.896773 [28] => 2021-06-24 16:57:01.896773 ) Array ( [27] => 27 [28] => 27 [NOW(6)] => 2021-06-24 16:57:01.897319 [29] => 2021-06-24 16:57:01.897319 ) Array ( [28] => 28 [29] => 28 [NOW(6)] => 2021-06-24 16:57:01.897815 [30] => 2021-06-24 16:57:01.897815 ) Array ( [29] => 29 [30] => 29 [NOW(6)] => 2021-06-24 16:57:01.898545 [31] => 2021-06-24 16:57:01.898545 ) Array ( [30] => 30 [31] => 30 [NOW(6)] => 2021-06-24 16:57:01.899239 [32] => 2021-06-24 16:57:01.899239 ) Array ( [31] => 31 [32] => 31 [NOW(6)] => 2021-06-24 16:57:01.899890 [33] => 2021-06-24 16:57:01.899890 ) Array ( [32] => 32 [33] => 32 [NOW(6)] => 2021-06-24 16:57:01.900507 [34] => 2021-06-24 16:57:01.900507 )
    Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access violation: 1203 User id16889********* already has more than 'max_user_connections' active connections in /storage/ssd5/226/16889226/public_html/test.php:19 Stack trace: #0 /storage/ssd5/226/16889226/public_html/test.php(19): PDO->query('SELECT ALL 33, ...') #1 {main} thrown in /storage/ssd5/226/16889226/public_html/test.php on line 19

    donc cela ne vient pas de mon code et il n'y a pas de solution à mon problème ?

    Merci,
    bonne soirée

  8. #8
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 043
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 043
    Points : 8 075
    Points
    8 075
    Billets dans le blog
    17
    Par défaut
    Tu peux nous montrer le code utilisé ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 22
    Points
    22
    Par défaut
    Citation Envoyé par Séb. Voir le message
    Tu peux nous montrer le code utilisé ?
    oui, voilà :

    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
    <?php session_start(); ?>
     
    <!DOCTYPE html>
     
    <html lang="fr">
    	<head>
    		<title>titre</title>
    		<meta charset="utf-8" />
    		<meta http-equiv="content-Style-Type" content="text/javascript" />
    	</head>
     
    <body>
     
    <?php 
    include('includes/_identifiants.php');		// CONNEXION A LA BDD
     
    for ($i = 1; $i <= 50; $i++) {
        $sql = "SELECT ALL {$i}, NOW(6)";
        print_r($bdd->query($sql)->fetch());
    }
     ?>
    	</body>
    </html>

  10. #10
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 043
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 043
    Points : 8 075
    Points
    8 075
    Billets dans le blog
    17
    Par défaut
    Trop compliqué. Fais une page toute simple, sans HTML, la plus courte possible, sans include() (dont on ignore le contenu), ni rien de superflu.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/08/2008, 12h44
  2. Error 1004 - Boucle enregistrement valeur colonne
    Par jbulysse dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 17/07/2008, 12h45
  3. [MySQL] syntaxe error dans une requête complexe
    Par info_sara dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/06/2008, 21h56
  4. [Système] Parse error sur exécution requête
    Par Sytchev3 dans le forum Langage
    Réponses: 1
    Dernier message: 31/07/2007, 18h48
  5. pb parse errors du à boucle
    Par richton95 dans le forum Langage
    Réponses: 6
    Dernier message: 16/11/2005, 13h18

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