Optimisation code

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Optimisation code

Re: Optimisation code

par Gaara37 » 11 nov. 2010, 15:17

Bonjour à tous,

J'ai trouvé d'où provenait la lenteur de traitement, c'était ce IF/ELSE avec les requêtes (requête préparé ou non, le temps de traitement était identique) :
// On compare les 2 quantiemes, si ils sont différents, il faudra mettre à jour également la date de mise en carton et date d'épuration pour les 2 quantiemes
  if ($quantieme_codebarre != $quantieme_codebarre_suivant) {
  // On met à jour la table avec la date de mise en carton + la date d'épuration pour le quantieme du site
   $query_maj_carton = "update etj420 set date_mise_encarton='$date_jour', date_purge_lots='$date_purge_lots' where (quantieme ='$quantieme_codebarre' and annee='$annee_codebarre' and   code_site='$_SESSION[codesite]')";
 $result_maj_carton = mysql_query($query_maj_carton) or die ('Erreur dans la requête : ' . $query_maj_carton . '<br>Avec l\'erreur : ' . mysql_error());
  } else {
  // On met à jour la table avec la date de mise en carton + la date d'épuration pour le quantieme suivant du site
  $query_maj_carton = "update etj420 set date_mise_encarton='$date_jour', date_purge_lots='$date_purge_lots' where (quantieme ='$quantieme_codebarre_suivant' and annee='$annee_codebarre' and code_site='$_SESSION[codesite]')";
 $result_maj_carton = mysql_query($query_maj_carton) or die ('Erreur dans la requête : ' . $query_maj_carton . '<br>Avec l\'erreur : ' . mysql_error());
  }
Ce code ne sert à rien puisque dans la requête principale, j'update par numéro traité donc il était inutile de savoir si le quantième suivant était différent de celui traité... J'ai reformulé la requête principale et créer un update tout simple par rapport au quantième et l'année. Le traitement se fait en 1 seconde maximum !! Merci à tous, car j'ai pu apprendre ce qu'était les requêtes préparées.

@+

Re: Optimisation code

par AB » 10 nov. 2010, 17:12

Ton code est plus lisible, et tu es passé à PDO, c'est déjà une bonne mise à jour car comme indiqué en bas de cette page il est déconseillé d'utiliser mysql pour les nouveaux projets.

Concernant les requêtes préparées, il est recommandé de les utiliser pour faire des requêtes dans des boucles mais comme indiqué dans la doc, les gains seront d'autant plus important que les requêtes sont complexes. Avec des requêtes simples il est logique que les gains soient moins importants.

Cela dit tu auras fait le maximum pour optimiser les performances de ce code en l'état.
Si cela ne suffit pas, maintenant tu sais que ce n'est pas le code qu'il faut optimiser mais la méthode qu'il faut revoir.

Re: Optimisation code

par stealth35 » 10 nov. 2010, 15:00

cool, par contre je te conseil de ne pas faire ca :
"update etj420 set num_carton = '$num_carton', code_site = '$_SESSION[codesite]' where (num_liaison = :num_liaison)"
mais plutot
UPDATE `etj420` SET `num_carton` = :num_carton, `code_site` = :code_site WHERE `num_liaison` = :num_liaison
en mettant les paramètres dans le execute

Re: Optimisation code

par Gaara37 » 10 nov. 2010, 14:55

ca veux dire que tu fais plusieurs requête en même temps sans libérer les ressources, si tu veux récupèrer qu'un seul résultat d'une requête, il faut faire un closeCusor() après le fetch()
C'est exactement ça, je viens de trouver et d'appliquer ce paramètre et ça fonctionne, j'ai pu mettre à jour tous les codes passés en paramètre.
Je vous tiendrais au courant.

@+ tard

Re: Optimisation code

par stealth35 » 10 nov. 2010, 14:48

ca veux dire que tu fais plusieurs requête en même temps sans libérer les ressources, si tu veux récupèrer qu'un seul résultat d'une requête, il faut faire un closeCusor() après le fetch()

Re: Optimisation code

par Gaara37 » 10 nov. 2010, 14:39

Quelques infos grâce à la gestion des erreurs de PDO, voici là ce que j'ai pour l'update en message d'erreur :
Warning: PDOStatement::execute() [function.execute]: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute. in saisie_trt.php on line 109
Ca veut dire quoi ?
Merci
@+ tard

Re: Optimisation code

par stealth35 » 10 nov. 2010, 14:34

si t'as PDO tout de suite c'est mieux, par contre comme t'as fais ta connexion ?

Re: Optimisation code

par Gaara37 » 10 nov. 2010, 14:28

Re bonjour,

Malgré certaines divergences d'opinion je continue de chercher en me basant sur les requêtes préparées. J'utilise désormais les fonctions liés à PDO. Cela fonctionne pas mal pour mes premières de vérification, mais je n'arrive pas à mettre à jour.

Voici la requête préparé pour l'update :
$mise_encarton = $bdd->prepare("update etj420 set num_carton = '$num_carton', code_site = '$_SESSION[codesite]' where (num_liaison = :num_liaison)");
$num_carton et $_SESSION[codesite] sont des variables qui ne bouge pas.

Et voici l'éxécution :
$mise_encarton->execute(array('num_liaison' => $codebarre[$i]));
Rien ne se met à jour. J'ai également essayé avec la méthode suivante :
$mise_encarton->bindValue(':num_liaison', $codebarre[$i]);
$mise_encarton->execute();
Même résultat, rien ne se met à jour. Ou est mon erreur ?

Merci pour votre aide.
@+ tard

Re: Optimisation code

par stealth35 » 10 nov. 2010, 12:14

oublie les requêtes préparées c'est trop de travaille pour pas grand chose au final
Tu pourrais pas faire des messages de plus d'une ligne une fois de temps en temps ? Tu lui dis d'abandonner un conseil qui lui a été donné dans ce fil (mais tu l'as peut-être pas lu), la moindre des choses ce serait de proposer une solution alternative non? :roll:

Qu'est-ce qui te gêne dans les requêtes préparées ? Je vois pas où il y a "beaucoup de travail", et à exécuter les mêmes requêtes 60 fois ça semble être une solution logique non?
je fais pas faire un roman sur le fait l'idée de faire des requêtes preparées est bonne, mais avec l'extension mysql faut oublier,
beaucoup de travail parce que faut refaire tout l'api de requête preparer pour l'extension, faut recréer le bind, ce qui fait qu'au lieu de faire 1 requête en fera 3 et qu'a la place de faire 4 ligne en en fera 30

Re: Optimisation code

par ouckileou » 10 nov. 2010, 12:01

oublie les requêtes préparées c'est trop de travaille pour pas grand chose au final
Tu pourrais pas faire des messages de plus d'une ligne une fois de temps en temps ? Tu lui dis d'abandonner un conseil qui lui a été donné dans ce fil (mais tu l'as peut-être pas lu), la moindre des choses ce serait de proposer une solution alternative non? :roll:

Qu'est-ce qui te gêne dans les requêtes préparées ? Je vois pas où il y a "beaucoup de travail", et à exécuter les mêmes requetes 60 fois ça semble être une solution logique non?

Re: Optimisation code

par Gaara37 » 10 nov. 2010, 12:00

oublie les requêtes préparées c'est trop de travaille pour pas grand chose au final
? Je suis perdu, certaines réponses plus haut me conseillent de les utiliser... Je ne comprends plus !!!
Pour info, entre temps, j'ai demandé l'activation de PDO et c'est désormais Ok. Tu en parlais dans un post précédent, tu penses que ça changerait quelque chose au niveau du temps de traitement ?

Merci
@+

Re: Optimisation code

par stealth35 » 10 nov. 2010, 11:54

oublie les requêtes préparées c'est trop de travaille pour pas grand chose au final

Re: Optimisation code

par Gaara37 » 10 nov. 2010, 11:50

bon...

en tout cas les requête préparer comme t'as fait ne sont pas bonne, avec mysql_* oublie
Peux-tu m'en dire plus ?

Merci.
sur ?
Sur le fait que mes requêtes préparées ne sont pas bonne avec mysql_*... Que dois-je faire pour améliorer ?

Merci.

Re: Optimisation code

par stealth35 » 10 nov. 2010, 11:47

bon...

en tout cas les requête préparer comme t'as fait ne sont pas bonne, avec mysql_* oublie
Peux-tu m'en dire plus ?

Merci.
sur ?

Re: Optimisation code

par Gaara37 » 10 nov. 2010, 11:45

bon...

en tout cas les requête préparer comme t'as fait ne sont pas bonne, avec mysql_* oublie
Peux-tu m'en dire plus ?

Merci.