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 :

tache cron, parse xml et Too many connections


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Points : 36
    Points
    36
    Par défaut tache cron, parse xml et Too many connections
    Bien le bonsoir,

    J'ai mis en place une tache cron sur mon serveur dédié.

    Cette tache cron lance chaque minute un fichier php qui parse un fichier xml de 8 mega et insère les données dans une table mysql contenant 50 000 utilisateurs.

    Quand j'arrête cette tache cron tout va bien... mais quand elle fonctionne, j'ai régulièrement des plantages sur le site avec cette erreure : "PHP Warning: mysqli_connect(): (HY000/1040): Too many connections in..."

    Je ne suis pas pro, encore moins expert, j'ai bidouillé tout ça moi-même sur un site privé.

    Voici mon fichier php :

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    <?php
    include('conn_sql.php');
    $sexe='femme';
    $document = new DOMDocument();
    $document->load('https://example.com/format=xml');
    mysqli_query($conn, "UPDATE users SET is_online=0 WHERE sexe='$sexe'") or die(mysqli_error($conn));
     
    $xpath = new DOMXpath($document);
     
    $entries = $xpath->evaluate('/*/ressources');
    foreach($entries as $entry) {
        $username = $xpath->evaluate('string(username)', $entry);
        $nb_followers = $xpath->evaluate('string(num_followers)', $entry);
        $nb_likers = $xpath->evaluate('string(num_likers)', $entry);
        $description = $xpath->evaluate('string(topic_title)', $entry);
        $description = mysqli_real_escape_string($conn,$description);
        $pseudo = $xpath->evaluate('string(pseudo)', $entry);
        $pseudo = mysqli_real_escape_string($conn,$pseudo);
     
        $result = mysqli_query($conn, "SELECT username FROM users WHERE sexe='$sexe' AND username='$username'");
     
        $tags = array_map(
          function(\DOMElement $node) {
              return $node->textContent;
          },
          iterator_to_array($xpath->evaluate('tags/ressources', $entry))
        );
        if(!$row = mysqli_fetch_row($result) || $nb_followers < 100){
               mysqli_query($conn, "INSERT INTO users (sexe,username,pseudo,bio_en, bio_fr, bio_es, bio_it, bio_de, bio_pt,nb_followers,nb_likers,temp_tags_en,temp_tags_fr,temp_tags_es,temp_tags_it,temp_tags_de,temp_tags_pt) VALUES ('" . $sexe . "','" . $username . "','" . $pseudo . "','" . $description . "','" . $description . "','" . $description . "','" . $description . "','" . $description . "','" . $description . "','" . $nb_followers . "','" . $nb_likers . "','".implode(',', $tags)."','".implode(',', $tags)."','".implode(',', $tags)."','".implode(',', $tags)."','".implode(',', $tags)."','".implode(',', $tags)."')") or die(mysqli_error($conn));
        }
        else{
               mysqli_query($conn, "UPDATE users SET bio_en='$description',bio_fr='$description',bio_es='$description',bio_it='$description',bio_de='$description',bio_pt='$description',pseudo='$pseudo',nb_likers='$nb_likers',temp_tags_en='".implode(',', $tags)."',temp_tags_fr='".implode(',', $tags)."',temp_tags_es='".implode(',', $tags)."',temp_tags_it='".implode(',', $tags)."',temp_tags_de='".implode(',', $tags)."',temp_tags_pt='".implode(',', $tags)."',is_online=1,n_last=now() WHERE username='$username' AND sexe='$sexe'") or die(mysqli_error($conn));
        }
    }
    mysqli_close($conn);
    ?>
    Qu'en pensez-vous ? Comment éviter cette erreur récalcitrante ?
    Est-ce un problème côté script ? côté serveur ?
    Merci d'avance !

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Si tu déplaces le include('conn_sql.php'); juste après le $document->load(... ça donne quoi?

    Je vois que l'url comporte "format=xml". Y-a-t'il d'autres formats possibles, quels sont-ils?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Points : 36
    Points
    36
    Par défaut
    Salut,

    Il y a le format "json" et "yaml"
    Mais... je ne peux pas les utiliser sinon je dois tout recoder et j'ai déjà mis deux semaines à trouver ce code pour parser du xml, en recopiant des exemples sur le net et en adaptant
    Je ne suis pas développeur c'est trop galère
    Et, il n'y a personne sur le site en question, c'est un site privé, mais ce matin encore "too many connection" ! grrrrr

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Ton script est probablement long à s'executer et utilise donc une connexion mysql quasi en permanence.
    Au contraire d'une page de site plus classique qui ouvre une connexion récupère les infos et la libère.

    Si ton hébergement est configurer avec un nombre de connexion mysql faible tu peux rencontrer ce problème quand tu visite le site en plus du script qui tourne .
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ton script est probablement long à s'executer et utilise donc une connexion mysql quasi en permanence.
    À commencer par le parsing d'un fichier distant xml géant alors que la connexion à mysql est ouverte, d'où la modification que j'ai suggérée et à laquelle tu n'as donné aucun retour. Si malgré ça le problème persiste, il va falloir prendre le taureau par les cornes et envisager toute modification à même d'accélérer ton script, avec xml ou pas.
    Autre chose que tu peux faire, en mettant la colonne username en clef primaire au besoin, c'est de remplacer ton select/if/insert/else/update par une seule requête du type: INSERT INTO TABLE users (sexe,username,pseudo,...) VALUES (,,) ON DUPLICATE KEY UPDATE sexe='...', pseudo='...',... ou en créant une procédure stockée si les conditions à tester pour l'insertion sont plus complexes.

    Dans un premier temps, tu peux rajouter LIMIT 1 à ta requête ligne 20.
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mai 2011
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mai 2011
    Messages : 63
    Points : 36
    Points
    36
    Par défaut
    Merci à vous 2 !
    Le fait de déplacer le include('conn_sql.php'); juste après le $document->load(... n'a rien donné
    Je vais maintenant essayer ces nouvelles suggestions

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Ce qui serait bon de savoir, c'est le nombre de connexions max autorisées au serveur MySQL (SHOW variables LIKE 'max_connections';). (c'est une pratique commerciale de fixer cette limite à 1 pour forcer le client à payer pour des services supplémentaires.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

Discussions similaires

  1. [MySQL] ERROR connect: Too many connections
    Par mdjalel dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 20/11/2006, 18h19
  2. Pb aléatoire : too many connections
    Par lebechen dans le forum Hibernate
    Réponses: 14
    Dernier message: 11/10/2006, 18h22
  3. Erreur au lancement de mysqld : Too many connection
    Par Fonzy17 dans le forum Outils
    Réponses: 12
    Dernier message: 20/04/2006, 16h48
  4. Too many connections - Configuration MySQL
    Par Adz3 dans le forum Requêtes
    Réponses: 5
    Dernier message: 27/01/2006, 17h09
  5. [JonAs]JOnAS SQLException "Too Many Connections"
    Par uron86 dans le forum JOnAS
    Réponses: 4
    Dernier message: 23/06/2005, 09h26

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