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 :

Améliorer les performances du script PHP [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut Améliorer les performances du script PHP
    Bonjour à tous !
    J'ai mon code qui permet:

    Ouvrir un fichier texte ayant la structure suivante:

    23733000227
    23733000228
    23733000229
    23733000230
    23733000231
    23733000232

    **Le fichier a plus de 20 000 lignes**

    1- )
    je dois prendre chacun de ces nombres et comparer ses 7 derniers chiffres avec les 7
    derniers chiffres de chacun des nombres de la première colonne (IMSI) de la table de ma
    Base de données MySQL ci-dessous:

    --(IMSI)-------------(MDN)
    624030743830000 23733013285
    624030743830001 23733013286
    624030743830002 23733013287
    624030743830004 23733013288
    624030743830005 23733013289
    624030743830006 23733013290

    **Ma table a 500 000 Lignes**

    2- )
    S'il y'a 1 ( il est unique s'il existe), il le récupère (IMSI) et récupère aussi le nombre qui se
    trouve sur la même ligne (MDN) à deuxième colonne et affiche les trois:

    - Nombre de départ

    - IMSI trouvé semblable ( nombre de la colonne IMSI donc les 7 derniers chiffres sont
    semblables aux 7 derniers chiffres du nombre contenu dans le fichier texte)

    - MDN (nombre de la colonne MDN) de la même ligne que l'IMSI trouvé semblable au
    nombre de départ.

    Mon code fonctionne, il fait le travail attendu. Mais le temps d'exécution est extrêmement long **plus de 30 minutes**.
    Voici mon script:

    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
    37
    38
    <?php
    set_time_limit(0);
     
    //Connexion à la BD
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    //On ouvre le fichier en question (en lecture seule)
    $handle = fopen("fichiernum.txt", "r");
    $i=0;
     
    echo '<table align=" justify" border = 2 valign = middle>';
    //on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
    while ($data = fgetcsv($handle, 10000, ",")) 
    	  {
     
    //on ne récupère que les 7 derniers caractères de chaque ligne avec la fonction substr
    	$rest = substr($data[0],-7);
     
    //On établie une requéte qui ne remonte que les MDN finissant par les 7 derniers chiffre de notre $rest. Un seul résultat remonte donc...
    $sql = mysql_query('SELECT * FROM  `coordab` WHERE  `IMSI` LIKE  "%'.$rest.'"');
    $result =mysql_fetch_array($sql);
    $i++;
     
    //on affiche les résultats demandés
    echo '<tr>';
    echo '<th>'.$i.'</span>'.'</th>';
    echo '<th>'.$data[0].'</th>';
    echo '<th>'.$result['IMSI'].'</th>';
    echo '<th>'.$result['MDN'].'</th>';
    echo '</tr>';
        }
    echo '</table>';
    //On ferme le fichier
    fclose($handle);
    echo'</div>';
     
    ?>
    S'il vous plait aidez moi à optimiser mon script pour réduire ce temps d'exécution.
    Ou bien montrez moi une autre méthode plus performante pour faire le même travail.
    Merci d'avance.

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    d'après tes explications : cela revient à dire que tu fais au moins 20 000 requêtes mysql_query() par fichier traité . Faut pas t'attendre à des miracles en terme de temps d'exécution...

    Une autre approche qui devrait drastiquement réduire le temps de traitement :
    - tu lis ton fichier en bloc, tu injectes en une passe les données nécessaires à la comparaison dans une table de traitement puis tu lances la comparaison et enfin tu récupères le résultat à mettre en forme et afficher.
    (pose les bon index aussi)

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Merci pour votre réponse.

    J'ai opté pour votre approche, je peux insérer les 7 derniers chiffres de chaque nombre de mon fichier texte dans une table de traitement.
    Maintenant comment je peux faire pour récupérer les IMSI dont les 7 derniers chiffres sont semblables à ces chiffres de la table de traitement ainsi que les MDN de correspondants à ces IMSI.

    S'il vous plait aidez moi, je suis nouveau en php.
    Merci d'avance.

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Simple,

    Supposons que tu aies 2 tables :
    - t_import qui contient 1 colonne (num) stockant les données brutes à traiter (tes 20 000 lignes)
    - t_ref qui contient 2 colonnes (imsi, mdn) (tes 500 000 lignes)

    tu extraits les enregistrements joints comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
        imsi, 
        mdn, 
        num
    FROM `t_ref` r
        INNER JOIN `t_import` i ON RIGHT(r.`imsi`, 7) = RIGHT(i.`num`, 7)

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Merci encore pour votre aide.

    Maintenant comment afficher les résultats ?
    Voici ce que j'ai fait :
    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
     
             	<?php	
     
    set_time_limit(0);
     
    //Connexion à la BD
    mysql_connect('localhost','root','');
    mysql_select_db('gestnum');
     
    $req ='SELECT 
        IMSI, 
        MDN, 
        ESN1
    FROM `coordab` r
        INNER JOIN `updateesn1` i ON RIGHT(r.`IMSI`, 7) = RIGHT(i.`ESN1`, 7)';
     
    $exe = mysql_query($req); 
    $result = mysql_fetch_array($exe);
    echo $result['ESN1'];
    Voici l'erreur qu'il m'affiche:
    ( ! ) Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\wamp\www\etudephp\recyclage.php on line 17
    La colonne ESN1 de la table updateesn1 est bien rempli ainsi que les colonnes IMSI et MDN de coordab.

    Comment faire pour visualiser les resultats ?

    S'il vous plait aidez moi encore.
    Merci.

  6. #6
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Donne l'erreur exacte que mysql te renvoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $exe = mysql_query($req) or die(mysql_error());

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2014
    Messages : 56
    Points : 34
    Points
    34
    Par défaut
    Bonjour !

    Excusez moi de ce que je suis un peu embrouillé.

    Plus précisément voilà ce que je veux:

    J'une table nommée coordab ayant 3 colonnes : IMSI, MDN, NUMF . Mon souci de savoir la requête qui permet de:

    - Prendre chaque ligne de NUMF et comparer ses 7 derniers chiffres aux 7 derniers chiffres de chaque ligne de IMSI

    - Là où ces 7 derniers chiffres sont égaux, elle récupère cette ligne IMSI, et le MDN de cette ligne de la colonne MDN ainsi que la ligne NUMF testé.

    Exemple:

    ------IMSI----------------------MDN------------NUMF
    624030743830010-------2373300002E-------2333000034
    624030743830015-------2373300002S------2333830023
    624030743830019-------237330000D1-------2333000015
    624030743830023---2373300002N--------2333000084
    624030743830000-------237330000DO-------2333000009

    Résultats:

    NUMF : 2333830023
    IMSI : 624030743830023
    MDN : 2373300002N


    S'il vous plait aidez moi.
    Merci d'avance.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    faudrait pas abuser, j'ai quand même sacrément l'impression de faire tes devoirs.
    Avec tout ce que j'ai déjà posté, tu aurais dû t'en sortir tout seul.
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
        a.`imsi`,
        a.`mdn`,
        b.`numf`
    FROM 
        `t_coordab` a INNER JOIN `t_coordab` b ON RIGHT(a.`imsi`, 7) = RIGHT(b.`numf`, 7)
    C'était dur hein ??

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

Discussions similaires

  1. PHP 7.1.0 disponible
    Par Arsene Newman dans le forum Langage
    Réponses: 301
    Dernier message: 13/12/2016, 12h08
  2. Optimisation de jsp pour améliorer les performances
    Par djuddju dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 01/12/2006, 05h50
  3. Réponses: 2
    Dernier message: 01/08/2006, 10h20
  4. [IW][D7] améliorer les performances
    Par Magnus dans le forum Bases de données
    Réponses: 19
    Dernier message: 11/10/2005, 20h46

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