Temps d'exécution du batch tres tres long
Résolu/Fermé
chaima.abdouli
Messages postés
94
Date d'inscription
mercredi 17 juin 2015
Statut
Membre
Dernière intervention
3 septembre 2015
-
17 août 2015 à 16:42
chaima.abdouli Messages postés 94 Date d'inscription mercredi 17 juin 2015 Statut Membre Dernière intervention 3 septembre 2015 - 18 août 2015 à 12:41
chaima.abdouli Messages postés 94 Date d'inscription mercredi 17 juin 2015 Statut Membre Dernière intervention 3 septembre 2015 - 18 août 2015 à 12:41
A voir également:
- Temps d'exécution du batch tres tres long
- Pc long a demarrer - Guide
- Blocage agriculteur carte en temps réel - Accueil - Transports & Cartes
- Fichier batch - Guide
- Renommer plusieurs fichiers en même temps - Guide
- Combien de temps reste une story sur facebook - Guide
3 réponses
jordane45
Messages postés
38308
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
24 novembre 2024
4 705
17 août 2015 à 16:47
17 août 2015 à 16:47
Bonjour,
Des idées .. oui j'en ai ..... mais.... est-ce qu'elles conviendront à tes besoins... that's the question....
Plus sérieusement.... comment penses tu que nous allons pouvoir te répondre sans voir une seule ligne de ton code ???
Mais bon.. en général ...par quoi peuvent s'expliquer des lenteurs d'exécution de nos codes .....
- Ils sont mal pensés et/ou Ils ne sont pas optimisés (des boucles dans des boucles....dans des boucles..... par exemple)
- Ils font appels à des requêtes SQL .... qui sont peut être pas optimisées ... ou sur des tables sans indexes ....
- Ils font des boucles sur des requêtes dans des boucles sur des requêtes....(voir points 1 et 2 précédents.... )
voila....
Si tu veux que l'on se pense un peu plus en détail sur le souci ... il faudra donc que tu nous montres ton code....
**** Attention ****
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum. (et faire de l'indentation pour le rendre lisible)
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
.
Des idées .. oui j'en ai ..... mais.... est-ce qu'elles conviendront à tes besoins... that's the question....
Plus sérieusement.... comment penses tu que nous allons pouvoir te répondre sans voir une seule ligne de ton code ???
Mais bon.. en général ...par quoi peuvent s'expliquer des lenteurs d'exécution de nos codes .....
- Ils sont mal pensés et/ou Ils ne sont pas optimisés (des boucles dans des boucles....dans des boucles..... par exemple)
- Ils font appels à des requêtes SQL .... qui sont peut être pas optimisées ... ou sur des tables sans indexes ....
- Ils font des boucles sur des requêtes dans des boucles sur des requêtes....(voir points 1 et 2 précédents.... )
voila....
Si tu veux que l'on se pense un peu plus en détail sur le souci ... il faudra donc que tu nous montres ton code....
**** Attention ****
Merci de bien vouloir utiliser la coloration syntaxique (les balises de code) lorsque tu postes du code sur le forum. (et faire de l'indentation pour le rendre lisible)
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
.
NHenry
Messages postés
15163
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 novembre 2024
345
17 août 2015 à 16:47
17 août 2015 à 16:47
Sans, code impossible de répondre .
la coloration syntaxique.
la coloration syntaxique.
chaima.abdouli
Messages postés
94
Date d'inscription
mercredi 17 juin 2015
Statut
Membre
Dernière intervention
3 septembre 2015
2
Modifié par jordane45 le 17/08/2015 à 16:55
Modifié par jordane45 le 17/08/2015 à 16:55
Ah oui je suis désolée voici mon code :
<?php /*---------------------CONNEXION MYSQL----------------------*/ $servername='localhost'; //localhost $database_username=''; // $database_password=''; // $database_name=''; // // EDIT : Suppression des infos de connexion $link = mysqli_connect($servername,$database_username,$database_password) or die("Erreur de connexion au serveur"); //mysql_connect mysqli_select_db($link, $database_name) or die("Erreur de connexion à la BDD"); //old: mysql_select_db /*---------------------FIN CONNEXION MYSQL----------------------*/ /*---------------------RÉCUPÉRATION DU FICHIER STOCK et INITIALISATION----------------------*/ $fichier = file("../public/spidi/AX6207F0.CSV"); $fp = fopen("../public/spidi/AX6207F0.CSV","r"); $total = count($fichier); set_time_limit(800); $ean13 = ""; $dispo = ""; $ligne = 0; $dateFichier = ""; $date = ""; $dateDispo = ""; $disponibilite = ""; $quantitedisponible = ""; $i=0; /*---------------------FIN RÉCUP----------------------*/ /*---------------------MISE A JOUR DU STOCK----------------------*/ echo("Parcours du fichier...")."<br/>"; while($tab=fgetcsv($fp,1000,';')) { $champs = count($tab);//nombre de champs dans la ligne en question $ligne++; $quantitedisponible = $tab[9]; $ean13 = $tab[16]; echo("hey you ").$tab[16]."<br/>"; $batch = "SELECT id_product_attribute,id_product, etat_dispo_externe, etat_dispo FROM ps_product_attribute where ean13 = ".$ean13.""; $requete = mysqli_query($link, $batch); $resultat= mysqli_fetch_array($requete); //--------------------POUR STOCK DISPONIBLE--------------------// if ($quantitedisponible!=0000000 ) { $batch2 = "SELECT quantity FROM ps_product_attribute where ean13 = '".$ean13."'"; $requete2 = mysqli_query($link, $batch2); $quantity = mysqli_fetch_array($requete2); $batch3 = "SELECT available_date FROM ps_product_attribute where ean13 = '".$ean13."'"; $requete3 = mysqli_query($link, $batch3); $available_date = mysqli_fetch_array($requete3); { $date = date('y-m-d'); $dateDispo = new DateTime(''.$date.' +15 day'); $result = $dateDispo->format('d/m/Y'); $disponibilite = "Livraison prevue le ".$result; $batch = "UPDATE ps_product_attribute SET quantity = '5' where ean13 = '".$ean13."'"; $requete = mysqli_query($link, $batch); $batch2 ="UPDATE ps_stock_available SET quantity = '5' where id_product_attribute = '".$resultat['id_product_attribute']."' and id_product = '".$resultat['id_product']."'"; $requete2 = mysqli_query($link, $batch2); $batch3 = "UPDATE ps_product_attribute SET available_date = DATE_ADD(('$date,y-m-d'), INTERVAL 15 DAY) where ean13 = '".$ean13."'"; $requete3 = mysqli_query($link, $batch3); echo("la date a ete bien mise a jour: ").$ean13."<br/>"; $batch4 ="UPDATE ps_product_attribute_shop SET available_date = DATE_ADD(('$date,y-m-d'), INTERVAL 15 DAY) where id_product_attribute = '".$resultat['id_product_attribute']."'"; $requete4 = mysqli_query($link, $batch4); } $batch = "UPDATE ps_product_attribute SET etat_dispo_externe = '".$disponibilite."' where ean13 = '".$ean13."'"; $requete = mysqli_query($link, $batch); $batch2 = "UPDATE ps_product_attribute SET etat_dispo = '4' where ean13 = '".$ean13."'"; $requete2 = mysqli_query($link, $batch2); echo("Stock mis a jour a 5 pour le ean: ").$ean13."<br/>"; } //--------------------FIN STOCK DISPONIBLE --------------------// //--------------------POUR EPUISE-----------------------------// if ($quantitedisponible == 0000000 ) { $batch2 = "SELECT quantity FROM ps_product_attribute where ean13 = '".$ean13."'"; $requete2 = mysqli_query($link, $batch2); $quantity = mysqli_fetch_array($requete2); $batch3 = "SELECT available_date FROM ps_product_attribute where ean13 = '".$ean13."'"; $requete3 = mysqli_query($link, $batch3); $available_date = mysqli_fetch_array($requete3); { $date = ('0000-00-00'); $batch = "UPDATE ps_product_attribute SET quantity = '0' where ean13 = '".$ean13."'"; $requete = mysqli_query($link, $batch); $batch2 ="UPDATE ps_stock_available SET quantity = '0' where id_product_attribute = '".$resultat['id_product_attribute']."' and id_product = '".$resultat['id_product']."'"; $requete2 = mysqli_query($link, $batch2); $batch3 = "UPDATE ps_product_attribute SET available_date =('$date,0000-00-00') where ean13 = '".$ean13."'"; $requete3 = mysqli_query($link, $batch3); echo("la date a ete bien mise a jour: ").$ean13."<br/>"; $batch4 ="UPDATE ps_product_attribute_shop SET available_date =('$date,0000-00-00') where id_product_attribute = '".$resultat['id_product_attribute']."'"; $requete4 = mysqli_query($link, $batch4); } $batch = "UPDATE ps_product_attribute SET etat_dispo_externe = 'En rupture de stock' where ean13 = '".$ean13."'"; $requete = mysqli_query($link, $batch); $batch2 = "UPDATE ps_product_attribute SET etat_dispo = '7' where ean13 = '".$ean13."'"; $requete2 = mysqli_query($link, $batch2); echo("Stock mis a jour a 0 pour le ean: ").$ean13."<br/>"; } //--------------------FIN EPUISE --------------------// } mysqli_close($link); echo("Fin du Parcours du fichier...")."<br/>"; ?>
NHenry
Messages postés
15163
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
1 novembre 2024
345
Modifié par jordane45 le 18/08/2015 à 12:53
Modifié par jordane45 le 18/08/2015 à 12:53
En regardant rapidement:
- Pourquoi ne pas utiliser directement le résultat du file(...) qui se trouve dans $fichier et faire un explode sur chaque ligne ?
- Ensuite :
Me semble pas top :
- Tes tests :
Peuvent être replacés par :
- L'indentation est à refaire, c'est difficilement lisible.
- Tu fais des SELECT et tu ne te sers jamais du résultat.
- Après ton
$available_date = mysqli_fetch_array($requete3);
il y a une accolade qui ne sert à rien.
- Le code :
Pourquoi pas utiliser :
ça fait une opération en moins.
- Pareil, parenthèse fermée trop tôt.
- Quand tu fais tes requêtes, préfères utiliser ' à " pour tes chaines, car le " traite aussi de beaucoup de cas d'insertion (donc plus lent).
Si tu as plusieurs requêtes à exécuter sans avoir besoin du retour, utilises une requête combinée :
Dans ton test :
Une seule requête donnerait :
4 requêtes update d'un seul coup.
Voilà déjà pour un passage rapide.
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Merci d'y penser dans tes prochains messages.
.
- Pourquoi ne pas utiliser directement le résultat du file(...) qui se trouve dans $fichier et faire un explode sur chaque ligne ?
- Ensuite :
echo("hey you ").$tab[16]."<br/>";
Me semble pas top :
- La patrenthèse est fermé trop tôt.
- Faire un nouvel affichage à chaque ligne est très consommateur, regardes les fonctions ob_start & co.
- Tes tests :
if ($quantitedisponible!=0000000 ) { } if ($quantitedisponible==0000000 ) { }
Peuvent être replacés par :
if ($quantitedisponible!=0 ) { } else { }
- L'indentation est à refaire, c'est difficilement lisible.
- Tu fais des SELECT et tu ne te sers jamais du résultat.
- Après ton
$available_date = mysqli_fetch_array($requete3);
il y a une accolade qui ne sert à rien.
- Le code :
''.$date.' +15 day'
Pourquoi pas utiliser :
$date.' +15 day'
ça fait une opération en moins.
- Pareil, parenthèse fermée trop tôt.
echo("la date a ete bien mise a jour: ").$ean13."<br/>";
- Quand tu fais tes requêtes, préfères utiliser ' à " pour tes chaines, car le " traite aussi de beaucoup de cas d'insertion (donc plus lent).
"UPDATE ps_product_attribute SET quantity = '5' where ean13 = '".$ean13."'" Deviendrais donc : '"UPDATE ps_product_attribute SET quantity = \'5\' where ean13 = \''.$ean13.'\''
Si tu as plusieurs requêtes à exécuter sans avoir besoin du retour, utilises une requête combinée :
Dans ton test :
if ($quantitedisponible!=0000000 )
Une seule requête donnerait :
$requeteGeneral = mysqli_query($link, $batch.';'.$batch2.';'.$batch3.';'.$batch4.';');
4 requêtes update d'un seul coup.
Voilà déjà pour un passage rapide.
EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :
https://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code
Merci d'y penser dans tes prochains messages.
.
chaima.abdouli
Messages postés
94
Date d'inscription
mercredi 17 juin 2015
Statut
Membre
Dernière intervention
3 septembre 2015
2
18 août 2015 à 12:41
18 août 2015 à 12:41
Merci beaucoup !
17 août 2015 à 16:55