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 :

Optimisation requête cron


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2011
    Messages : 148
    Par défaut Optimisation requête cron
    Bonjour,

    J'ai actuellement ce script cron qui charge les données de 33 mondes ...

    Le problème étant qu'il est long ... et je voudrais savoir comment faire pour l'optimiser ! Merci d'avance

    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
    39
    <?php
    include("XXX"); 
     
    $sql = "SELECT * FROM infos" ;
    $fichiers = array();
    $res = mysql_query($sql);
    while ($data = mysql_fetch_object($res))
    $fichiers[] = $data->name;
    $fichiers2[] = $data->numero;
     
    function uncompressp($srcName, $dstName) {
    $string = implode("", gzfile($srcName));
    $fp = fopen($dstName, "w");
    fwrite($fp, $string, strlen($string));
    fclose($fp);
    }
     
    foreach($fichiers as $V)
    {
     
    $sql = mysql_query("SELECT * FROM infos WHERE name='".$V."'") or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
    while($data2 = mysql_fetch_array($sql)) {
     
    $file = "http://".$data2['numero'].".grepolis.com/data/players.txt.gz";
    }
    $newfile = "../mondes/".$V."/data/players.txt.gz";
    $path_end = "../mondes/".$V."/data/players.txt";
    copy($file, $newfile);
     
    uncompressp($newfile,$path_end);
    unlink($newfile);
     
     
    		mysql_query("TRUNCATE TABLE ".$V."_players");
    		$sql = mysql_query("LOAD DATA LOCAL INFILE '$path_end' INTO TABLE ".$V."_players FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\n'") or die('Erreur : '.mysql_error());
     
    }
     
    ?>

  2. #2
    Membre éclairé
    Inscrit en
    Octobre 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 50
    Par défaut
    Excuse moi, j'ai mis du temps pour répondre ! ^^

    où (dans un exemple précis pour toi) $nom_url_fichiers est le tableau:
    Index: conquers
    Nom_Table: fr20_conquers
    Url_Fichier: http:fr20.grepo....


    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
    function uncompgz($srcName, $dstName) {
    $string = implode("", gzfile($srcName));
    $fp = fopen($dstName, "w");
    fwrite($fp, $string, strlen($string));
    fclose($fp);
    }
     
     
     
     
    foreach( $nom_url_fichiers as $fichiers ) {
     
    		uncompgz ($fichiers['Url_Fichier'],$fichiers['Index'].'.txt');
    		$urlfichier = $fichiers['Index'].'.txt';
    		$nomtable = $fichiers['Nom_Table'];
    		mysql_query("TRUNCATE TABLE $nomtable");
    		$sql = "LOAD DATA LOCAL INFILE '$urlfichier' INTO TABLE $nomtable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\\\\' LINES TERMINATED BY '\\n'";
    		mysql_query($sql) or die('non mis à jour'.mysql_error());
    		}

    L'année prochaine, je répondrai à une autre de tes questions... :p
    C'est le plus optimal qui soit je pense...
    Tu peux toujours fusionner la fonction et le reste du script, supprimer quelques définitions de variables mais tu vas pas y gagner grand chose.
    'Load data infile' est optimisable mais ça n'a aucun intérêt dans ton cas précis.

    Suggestions:
    • Tu peux ajouter dans la boucle une ligne pour éditer un .txt dans lequel tu inscrits : 'fr20_conquers mis à jour',...etc
      Comme ça, à l'aide d'ajax, tu peux vérifier la progression de ta mise à jour en temps réel.
      Mais c'est contre-optimisatoire !
      Ou alors tu pousse sur F5 comme un forcené dans ton navigateur avec l'adresse de ton fichier. ^^

    • Je vois que tu places les fichiers sur ton disque, si tu ajoutes un TIMESTAMP dans l'nom($dstName), tu garderas un historique des bases précédentes. Ca prendra pas énormément de place et ça pourra s'avérer utile si tu développe des outils qui en ont besoin dans l'avenir.
      Si tu veux faire des graphiques de progression, ca t'évite d'updater tous les joueurs d'une table et donc de surcharger ta tache cron (déjà lourde).
      Aller chercher une ligne dans 25 fichiers pour créer le graph, le sauver en attendant que 24h passent, c'est mieux que d'updater 20.000 entrées dans une table plusieurs fois par jour...
      De plus, tu économises le temps d'écrasement de fichier dans ta boucle (il y'a quand meme plusieurs milliers de fichiers tous pays confondus !)
      effacer/créer c'est plus long que de créer tout court (sans être certain)

    • Il faut penser aussi que ton script peut planter, tu dépends quand meme d'1 serveur dont tu n'as pas l'contrôle (grepo) et puis ton matériel à toi aussi peut planter. Je te conseilles vivement à cause de la fonction TRUNCATE TABLE de te pencher sur la question parcque si t'es pas là et que t'as pas d'historique, c'est tout l'site qui va planter (au moins la première table).
      Une simple condition devant la fonction TRUNCATE oOu plutôt devant la boucle de màj peut résoudre le problème.

Discussions similaires

  1. optimisation requête-regroupement info
    Par mariobedard dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/09/2005, 15h10
  2. Besoin d'aide pour optimiser requête SQL
    Par Keuf95 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 06/09/2005, 16h02
  3. Optimiser requête utilisant NOT IN
    Par Neilos dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/08/2005, 14h24
  4. optimisation requête
    Par alex2205 dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 09/02/2005, 14h15
  5. optimisation requête SQL!!! help!!
    Par anathem62 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/05/2004, 16h26

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