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
Bonjour,


A chaque fois que je lance un script php, son temps de chargement est très très long ! c'est les scripts que j'utilise pour gérer le stock de mes boutiques en ligne !!

Any idea??
A voir également:

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
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

.

0
chaima.abdouli Messages postés 94 Date d'inscription mercredi 17 juin 2015 Statut Membre Dernière intervention 3 septembre 2015 2
17 août 2015 à 16:55
Vous trouverez le code ci dessous
0
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
Sans, code impossible de répondre .
la coloration syntaxique.
0
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
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/>";
?>




0
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
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 :
 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.
.
0
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
Merci beaucoup !
0