Optimisation des performances du code PHP

Fermé
nguim Messages postés 16 Date d'inscription mercredi 12 février 2014 Statut Membre Dernière intervention 25 février 2014 - 22 févr. 2014 à 12:25
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 - 25 févr. 2014 à 17:19
Salut à tous !

J'ai mon code qui me permet de charger ma BDD MySQL à partir d'un fichier texte.

Mon fichier texte a 9999 lignes et le temps d'exécution du script est très élevé ( plus de 25 minutes).

S'il vous plait aidez moi à optimiser ce script ou montrer une autre méthode pour la même tâche et avec un temps d'exécution réduit.

Voici mon code:
<?php

set_time_limit(0);
error_reporting(E_ALL ^ E_NOTICE);

mysql_connect('localhost','root','');
mysql_select_db('gestnum');

//on vide la table coordab avant
mysql_query("TRUNCATE TABLE coordab");

//On ouvre le fichier en question (en lecture seule)
$handle = fopen("fichab.txt", "r");

//on parcours tout le fichier (en faisant croire qu'il s'agit d'un csv pour faciliter le traitement)
while ($data = fgetcsv($handle, 10000, " ")) {
 
mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
 	           VALUES ('".$data[0]."','".$data[1]."','".$data[2]."','".$data[3]."','".$data[4]."','".$data[5]."')");
}
//On ferme le fichier
fclose($handle);

header('Location: alimenter-la-bd.php?info=charger');
?>


Merci d'avance !
A voir également:

1 réponse

mpmp93 Messages postés 6648 Date d'inscription mercredi 13 avril 2011 Statut Membre Dernière intervention 28 septembre 2015 1 339
Modifié par mpmp93 le 25/02/2014 à 16:11
Bonjour,

déja 9999 lignes en 25 minutes, c'est anormal!

On peut charger 10.000 lignes en quelques secondes....

Pour commencer, si votre fichier texte fait moins de 2 Mo (4 à 5 sur certains serveurs), faites simplement:

$montexte = file_get_contents("fichab.txt");


comme ça, vous avez tout le fichier dans une seule chaîne texte très longue....

Ensuite, votre chaîne, il faut l'exploder (voir explode) en séparant chaque ligne sachant que le séparateur est "\n"

$mesLignes = explode("\n", $montexte);


donc $meslignes est un tableau qui contient chaque ligne. Vous faites maintenant un autre explode sur les données si ces données sont séparées par le caractère " " (espace):

foreach($meslignes AS $ligne) {
    $mesdonnes = explode(" ", $ligne);
    ....ici la suite...
}


Ensuite vous re-construisez la chaîne à insérer en SQL avec implode:

   $monSql = '"'.implode('","', $ligne).'"';


et votre boucle foreach devient:

foreach($meslignes AS $ligne) {
    $mesdonnes = explode(" ", $ligne);
    $monSql = '"'.implode('","', $mesdonnes ).'"';
    ....ici la suite...
}


et enfin l'insertion de données:

foreach($meslignes AS $ligne) {
    $mesdonnes = explode(" ", $ligne);
    $monSql = '"'.implode('","', $mesdonnes).'"';
    mysql_query("INSERT INTO coordab (IMSI, MEID, ESN1, PUK1, AKY, MDN) 
             VALUES $monSql);
}


et ça devriat déja aller nettement plus vite!

A+




public function meilleurProgrammeurDuMonde() { return "MOI"; } // humour
2
Super_carotte Messages postés 1419 Date d'inscription mardi 8 janvier 2008 Statut Membre Dernière intervention 27 janvier 2015 127
25 févr. 2014 à 17:19
what else? tu fais même le café mpmp93 ;)
0