Optimisation code php

Optimisation code php - PHP - Programmation

Marsh Posté le 22-10-2012 à 18:35:20    

Bonjour
 
J'ai pris l'habitude coder comme cela pour séparer le php du html

Code :
  1. $i=0;
  2. $data = array();
  3. $result = null;
  4. $query = 'SELECT * FROM tb_promos' ;
  5. $result = mysql_query($query) or die($query . " - " . mysql_error());
  6. while($data = mysql_fetch_object($result)){
  7.   $id_promo[$i]  = $data->id_promo;
  8.   $page[$i] = $data->page;
  9.   $id_produit_gauche[$i] = $data->id_produit_gauche;
  10.   $contenu_promo_gauche[$i] = $data->contenu_promo_gauche;
  11.   $id_produit_droite[$i] = $data->id_produit_droite;
  12.   $contenu_promo_droite[$i] = $data->contenu_promo_droite;
  13.   $actif[$i] = $data->actif;
  14. $i++;
  15. }


 

Code :
  1. <?php for($i=0;$i<count($id_promo);$i++){ ?>
  2.         <tr>
  3.           <td><a href="modif_promo.php?id_promo=<?php echo $id_promo[$i]; ?>"><img border="0" src="images/edit_icon.png" width="16" height="16" ></a></td>
  4.           <td><?php echo $id_promo[$i]; ?></td>
  5.           <td><?php echo $page[$i]; ?></td>
  6.    <td><?php echo $id_produit_gauche[$i]; ?></td>
  7.    <td><?php echo $contenu_promo_gauche[$i]; ?></td>
  8.    <td><?php echo $id_produit_gauche[$i]; ?></td>
  9.    <td><?php echo $contenu_promo_droite[$i]; ?></td>
  10.    <td><?php if ( $actif[$i] == '1' ) { echo 'oui'; } else { echo 'non';} ?></td>
  11.   </tr>
  12.         <?php } ?>


 
Ca me convient mais j'ai l'impression que c'est pas très optimisé surtout au niveau de la mémoire
quand la table contient beaucoup d'entrées
 
Avez un conseil à me donner hormis le fait de virer le * de ma requête ?
 
Merci d'avance


Message édité par networkinfo le 22-10-2012 à 18:36:15
Reply

Marsh Posté le 22-10-2012 à 18:35:20   

Reply

Marsh Posté le 22-10-2012 à 20:54:30    

Je vois au moins trois points négatifs dans cette façon de coder :
 
1] Le count doit être en dehors de la boucle :
 
$max = count(...);
for ($i = 0; $i < $max; ++$i) {
...
}
 
2] N'oublies pas de faire un mysql_free_result($result) ou un truc du genre, sinon c'est comme si tu avais 2 fois ton tableau en mémoire ($result et $actif). Je t'invite par ailleurs à utiliser PDO, qui te permetra d'avoir des requêtes paramétrées et donc plus rapides en seconde exécution.
 
3] Faire N <?php instancie N fois le parseur PHP. Il vaut mieux faire un seul <?php, ecrire et concaténer ton html dans une chaine, et faire un echo à la fin.


Message édité par CyberDenix le 22-10-2012 à 20:55:29

---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 22-10-2012 à 20:57:32    

Avis personnel: je ne vois pas vraiment ce qui pourrait "optimiser" dans le sens revoir l'algorithme derrière, c'est une simple requète avec construction d'une table HTML. Par contre, il me semble que depuis un moment mysql_connect est déprécié, on utilise PDO ou mysqli.

 

Edit ::

 

Effectivement vu de la facon de Cyberdenix, le count en amont du for permet de ne pas avoir à réévaluer à chaque passage de boucle. Par contre pour le point n°3 je découvre, mais j'aimerai bien avoir plus d'infos sur l'impact en perfs car j'ai toujours fait ainsi dans mes vues :'(


Message édité par xaeon le 22-10-2012 à 20:59:48
Reply

Marsh Posté le 22-10-2012 à 21:00:08    

Merci beaucoup pour vos conseils !
 
Comme je charge tout dans un tableau, je sature la mémoire
Pourtant le moteur de template smarty fait bien comme ça non?
 
Je vais faire des tests avec vos conseils


Message édité par networkinfo le 22-10-2012 à 21:00:39
Reply

Marsh Posté le 22-10-2012 à 23:53:03    

On me demande d'optimiser... j'optimise !
 
Après c'est un deal entre la performance pure (mesurable), et la lisibilité personnelle que l'on attribue au code (pas mesurable). On penche dans un sens ou dans l'autre.
 
Par exemple, j'adore faire des foreach.
Si je m'écoutais, je les transformerais tous en while :B
 


---------------
Directeur Technique (CTO)
Reply

Marsh Posté le 23-10-2012 à 00:00:00    

:) Ok merci pour le petit éclaircissement

Reply

Marsh Posté le 23-10-2012 à 11:20:39    

Bonjour,
 
Une optimisation pourrait être le fait que finalement tu parses deux fois tes données et les stocks dans un tableau...  
Ce qui effectivement mange ta memory PHP.
 
Si tu avais un objet qui implémente la SPL (Iterator et Countable) et qui utilise les api mysql pour fetcher le resultat de mysql sur la methode "next()" de Iterator et qui renverrai un "num_rows" sur la methode "count()" alors tu n'aurais plus a utiliser la memory PHP ni a fetcher deux fois ton jeu de resultat.
Tu enverrai juste cet objet à ta vue et basta. Encore mieux : la methode "current()" renverrai un objet disposant lui même de méthode propre à un model donné.
 
A mon sens c'est là qu'il y a optimisation car ton appli fonctionnera quelque soit le nombre de ligne de ta table alors qu'actuellement ton memory limit arrivera un jour au max si les lignes de la requetes deviennent plus nombreuses ...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed