Optimisation des performances du code PHP

nguim Messages postés 16 Date d'inscription   Statut Membre Dernière intervention   -  
Super_carotte Messages postés 1420 Date d'inscription   Statut Membre Dernière intervention   -
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   Statut Membre Dernière intervention   1 340
 
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 1420 Date d'inscription   Statut Membre Dernière intervention   127
 
what else? tu fais même le café mpmp93 ;)
0