[PHP/mySQL] conseils d'optimisation

conseils d'optimisation [PHP/mySQL] - PHP - Programmation

Marsh Posté le 25-07-2005 à 14:20:44    

Bonjour à tous !
 
Je viens de faire quelques recherches sur le forum à propos d'optimisation de code PHP (associé à MySQL dans mon cas) et je me rends compte qu'il n'y a pas vraiment de topic parlant de ça.
J'ai donc pensé que ce serait bien de pouvoir réunir tous les conseils d'optimisation de code dans un seul et même topic.
 
Alors, je vous écoute : donnez-moi vos conseils et je les ajouterai au fur et à mesure dans ce post ;)
 
Merci d'avance :jap:
 
-------------------------------------------------------------
 
Quelques adresses utiles :
 
- http://developpeur.journaldunet.co [...] eurs.shtml (Les 10 plus grandes erreurs en programmation PHP, à lire absolument)
- http://www.php.net/manual/fr/ (le manuel PHP en français)
- http://www.nexen.net/docs/php/anno [...] ctions.php (le manuel PHP, vu par Nexen.net, en français)
- http://php.developpez.com/
- http://www.phpindex.com/
- http://www.phpteam.net/
- http://dev.mysql.com/doc/refman/5.0/fr/ (le manuel MySQL en français)
- http://forum.hardware.fr/forum2.ph [...] page=1&p=1 (Scipts les plus recherchés, merci berceker united :jap:)
 
-------------------------------------------------------------
 
Optimisation de code PHP :
 
- Article très intéressant sur la différence entre les simples quotes et les doubles quotes
- Bien structurer les echo en évitant par exemple d'intégrer les variables dans les "".
exemple : éviter echo "afficher $valeur"; préférer echo 'afficher',$valeur;
- Utiliser mysql_fetch_row() ou mysql_fetch_assoc() plutôt que mysql_fetch_array() pour récupérer les données d'une requête.
 
-------------------------------------------------------------
 
Optimisation des requêtes MySQL :
 
- Les colonnes  
Si vous avez 10 colonnes dans votre table mais n'en voulez que 2, ne demander que ces 2 colonnes.  
SELECT champ_1, champ_2 From table1 au lieu de SELECT * From table1
 
- Les lignes  
Idem, en utilisant WHERE pour enlever les lignes dont on n'a pas besoin  
SELECT * from table1 WHERE champ_1 = 5  
 
Le HAVING a un fonctionnement un peu similaire au WHERE à une différence près : il est exécuté à la fin de la requête, juste avant le transfert. C'est pratique pour supprimer des lignes sans pouvoir le faire avec un WHERE.  
Par exemple, on à une table avec des lignes de facture (prix de l'article, quantité et identifiant de la facture), on veut le total de chaque facture, mais seulement celles dont le montant total est supérieur à 1000. On ne peut pas déterminer ce montant en traitant chaque ligne individuellement, donc le WHERE ne sera pas utile.  
SELECT id_facture, SUM(prix * quantite) AS total_facture FROM lignes_factures GROUP BY id_facture HAVING total_factures >= 1000  
 
- Les tris
Autant les faire directement en MySQL si c'est possible  
SELECT champ_1, champ_2 From table1 ORDER BY champ_1 ASC  
 
- Le comptage  
Vous voulez savoir le nombre de lignes qui respectent une condition dans une table.  
1ère solution : SELECT champ_1 FROM table_1 WHERE champ_1 = 5 puis utilisation de mysql_num_rows() pour connaître le nombre de lignes du résultat.  
Là, MySQL va transférer toutes les lignes vers PHP, qui va les mémoriser. Tout ca, juste pour savoir combien il y en a.  
 
2ème solution : SELECT COUNT(champ_1) AS nb_lignes FROM table_1 WHERE champ_1 = 5  
Là, le résultat ne contient qu'1 ligne et 1 colonne. C'est quand même moins volumineux, non    
 
(bon, si vous voulez aussi parcourir le résultat, mieux vaut la 1ère méthode puisque vous aurrez de toute façon besoin de récupérer toutes les lignes)  
 
- Utilisation du LIMIT  
Le LIMIT indique que l'on souhaite récupérer seulement une partie du résultat. Par exemple, en ajoutant LIMIT 10,25 à la fin de votre requête MySQL ne transférera que 25 lignes, en commencant à la 10ème.
 
Pratique, lorsqu'il est combiné avec un tri, lorque l'on veut afficher des données sur plusieurs pages, pour déterminer un "top n", récupérer les 10 données les plus vieilles/récentes...
 
Il est également utile d'utiliser LIMIT 0,1 lorsqu'on est sûr que la requête ne retournera qu'une seule ligne. Ceci évitera à MySQL de continuer à chercher après avoir trouvé le seul résultat.


Message édité par nero27 le 26-11-2005 à 15:36:05
Reply

Marsh Posté le 25-07-2005 à 14:20:44   

Reply

Marsh Posté le 25-07-2005 à 15:04:56    

Réservé...


Message édité par nero27 le 25-07-2005 à 15:48:25
Reply

Marsh Posté le 25-07-2005 à 15:09:28    

Réservé ...


Message édité par nero27 le 25-07-2005 à 15:48:39
Reply

Marsh Posté le 25-07-2005 à 15:13:35    

Voici un trés bon liens :
http://www.vulgarisation-informati [...] er-php.php
c'est un espece de "benchmark" sur la réactivité de diférentes écritures possibles. Les simple et double guillemets, les boucles sont mis a l'épreuves, trés utilise pour optimiser son code.


Message édité par tofti le 25-07-2005 à 15:14:27
Reply

Marsh Posté le 25-07-2005 à 15:15:49    

nero27 a écrit :

C'est un topic pour les conseils d'optimisation du code PHP avec MySQL ;)


Ca ne me paraît pas judicieux. Celui qui voudrait profiter des conseils PHP uniquement ou MySQL uniquement va se taper l'autre partie, qui ne lui sera d'aucun intérêt. Ca n'en sera que moins lisible.
 
Enfin bon, c'est ton tomic.  [:airforceone]
 
Est-il bien nécessaire d'aborder les micro-optimisations ? Genre refaire encore une fois la comparaison entre les différentes façons de concaténer ou de faire un output ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 25-07-2005 à 15:17:22    

On me demande des conseils sur l'optimisations du code PHP et MySQl, moi j'en donne ... aprés, faut faire le tri, mais c'est pas  a moi de le faire ca :)


Message édité par tofti le 25-07-2005 à 15:17:37
Reply

Marsh Posté le 25-07-2005 à 15:18:28    

Je trierai les infos en plusieurs parties :  
- php pur
- mysql pur
- php/mysql
 
On peut tout aborder je pense ;)

Reply

Marsh Posté le 25-07-2005 à 15:20:12    

Tu aurais du réservé 3 parties, une seule, ca va etre short .. trés short ...

Reply

Marsh Posté le 25-07-2005 à 15:22:16    

tofti a écrit :

Tu aurais du réservé 3 parties, une seule, ca va etre short .. trés short ...


A la rigueur, supprime ton post entre les deux miens, ça m'en fera déjà deux ;)

Reply

Marsh Posté le 25-07-2005 à 15:25:03    

Voila, sircam, fait-en de meme ;-)

Reply

Marsh Posté le 25-07-2005 à 15:25:03   

Reply

Marsh Posté le 25-07-2005 à 15:41:08    

tofti a écrit :

Voila, sircam, fait-en de meme ;-)


Cfé.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 25-07-2005 à 15:41:53    

Ensuite, tu parles d'optimisation, c'est un peu vague :
 
- Performance ?
- Sécurité ?
- Lisibilité et maintenance ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 25-07-2005 à 15:48:06    

Je parle plutôt d'optimisation au niveau des performances !
Quelle fonction utiliser plutôt qu'une autre ? etc ...
;)

Reply

Marsh Posté le 25-07-2005 à 16:00:00    

Tu pourrais tout faire, pas seulement performances ...

Reply

Marsh Posté le 25-07-2005 à 16:04:53    

Pkoi pas !
On verra bien ;)

Reply

Marsh Posté le 25-07-2005 à 17:20:44    

nero27 a écrit :

Pkoi pas !
On verra bien ;)


Ca va rapidement être la foire si tu laisses partir dans tous les sens sans but précis. [:mlc]
 
A part ça, as-tu déjà fait un tour sur ce forum ? On parle régulièrement d'optimisations en tous genres, mais je ne vois rien dans ce topic. :o
 
Tu peux aussi faire des propositions, sur base de ce que la pêche sur Gougueule t'aura donné.


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 25-07-2005 à 23:31:25    

Ca pourrait être marrant de juger sur des exemples types non ?  
Genre, amene tes requetes à dos de chval et voyons comment les optimiser au mieux, non ? ;)


---------------
"L'informatique n'est pas plus la science des ordinateurs que l'astronomie n'est celle des télescopes." Michael R. Fellows & Ian Parberry
Reply

Marsh Posté le 25-07-2005 à 23:47:10    

Parcontre les betch sur le site je les trouve un peu foireux ... genre le fgets qui lit les 255 premiers caracteres ... J'veux bien mais je connais peu de cas ou tu peux t'en servir sans un filesize() .. Ou le file qui retourne pas le meme type que le file_get_contents ... ou le file_exists qui controle si le ficher existe alors que le is_file controle juste si c'est un path "correct" ... Ah, et aussi le switch VS if/elseif qui est pas vraiment significatif sur 2 cas (meme si c'est effectivement le if/elseif qui gagne si jeme rappelle bien)...
 
Bref je trouve qu'il faudrait p-e un peu mieux structurer tout ça ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 25-07-2005 à 23:58:56    

Je comprend pas bien quand vous parlez d'optimisation c'est quoi, c'est faire une seule ligne de commande pour une requete mysql (avec $machin = mysql_query( la requete sql) or die mysql_error(); ) au lieu de trois lignes, ou c'est autre chose.. Je vois pas trop en fait ce qu'il faut mettre dedant?? (désolé) :)

Reply

Marsh Posté le 26-07-2005 à 00:16:07    

Non ce dont tu parles c'est de la mise en page ... On pourrait se demander si ça change qqch au perf mais ça doit etre de l'ordre de la nanoseconde sur 1'000'000'000 d'appels :D ... L'optimisation c'est par exemple d'eviter de faire un SELECT * FROM matable si de toutes façon on n'a l'intention que de prendre l'id ... En gros essayer de reflechir pour pas faire perdre de temps au serveur


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-07-2005 à 11:31:35    

Pour commencer, y'a deux optimisations qu'on peut retenir :
- pour MySQL, éviter les champs inutiles dans une requête, comme l'a dit esox_ch
- bien structurer son code PHP : exemple, ne pas intégrer les variables dans les chaines des echo.
exemple :  
éviter  

Code :
  1. echo "afficher $valeur";


mais plutôt  

Code :
  1. echo 'afficher',$valeur;

Reply

Marsh Posté le 26-07-2005 à 11:57:09    

Hum okay, je vois maintenant, donc en fait moi j'optimise quedale :D :D :D à chaque fois je fait select * from matable (oui j'avou fouettez moi pour me punir :( )
et en plus je met toujours echo "afficher $valeur"; lol à par quand je doit concatener mon code.. :)
 
En clair j'ai encore quelques petites choses à apprendre.. :)
C'estun bon topic ça nero, il va servir à de nombreuses personnes je pense, continue à l'alimenter :)
 
@++ et bonne prog les gens. :)

Reply

Marsh Posté le 26-07-2005 à 12:14:36    

Salut!
 
Etant un tout jeune développeur PHP autodidcate, je me rends bien compte que je fais beaucoup de boulettes, et notamment que je ne structure pas mon code comme je devrais le faire.
 
Par exemple, je suis pas un adepte des fonctions alors qu'elles me simplifieraient bien la vie. Ensuite, je me rends bien compte que je réécris certains fragments de code plein de fois alors qu'il devrait y avoir moyen de le ne faire qu'une bonne fois pour toute. Mais comme la logique PHP-esque ne baigne pas encore mon esprit fatigué, ca ne me vient pas tout de suite :D
 
Donc puisqu'il s'agit ici de conseils d'optimisation, je vous suggère d'éventuellement donner quelques pistes de ce côté là, et vous garantit qu'y en a au moins un à qui ça servira :D
 
Merci!

Reply

Marsh Posté le 26-07-2005 à 12:27:03    

Onesque a écrit :


 
Par exemple, je suis pas un adepte des fonctions alors qu'elles me simplifieraient bien la vie.  
Ensuite, je me rends bien compte que je réécris certains fragments de code plein de fois alors qu'il devrait y avoir moyen de le ne faire qu'une bonne fois pour toute.


 
->> oui les fonctions  :lol:  :lol:  :lol:  
 

Reply

Marsh Posté le 26-07-2005 à 12:32:10    

Ben voilà :D
 
Non mais en fait, commme j'ai appris le peu que je connais en PHP sur des tutos, je sais ponctuellement faire des trucs, mais je n'ai pas la logique d'ensemble pour strucurer, aps me répéter... Or je pense que c'est le problème d'une majorité des développeurs débutants, surtout quand on n'a pas de prof pour nous instaurer d'office les bons réflexes :D
 
J'ai commencé à trvailler direct sur un projet, aprce que je pensais que c'était en me colletant direc' au concret que j'apprendrai le mieux et le plus vite. Ben j'ai appris plein de trucs, mais je ponds un code qui vous ferait surement bondir :o


Message édité par Onesque le 26-07-2005 à 12:32:37
Reply

Marsh Posté le 26-07-2005 à 13:09:16    

C'est le probleme que j'ai eu aussi etant totalement autodidacte ... Apres ... c'est avec l'experience qu'on apprend a optimiser & co


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-07-2005 à 13:17:28    

Bahj'au eu un prof pendant deux ans, mais il nous à jamais appris ça :)
 
A croire qu'il en savait rien :D :D

Reply

Marsh Posté le 26-07-2005 à 13:34:21    

Ou qu'ils ont autrechose a apprendre ... Désolé de te le dire mais je crois que dans ton cas il y a plus urgent que l'optimisation ... Mais bon de toutes façon c'est pas vraiment à l'ecole qu'on apprend ce genre de reflexe ... c'est en programmant pendant 10h et apres se rendre compte qu'en s'y prenant autrement on en aurait eu pour 10 min :D


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-07-2005 à 13:36:34    

esox_ch a écrit :

Désolé de te le dire mais je crois que dans ton cas il y a plus urgent que l'optimisation ...


 
Dit moi dit moi, c'est toujours bon à prendre les critiques :D et je ferais en sorte d'apprendre déjà ce que je dois :)

Reply

Marsh Posté le 26-07-2005 à 13:44:17    

Onesque a écrit :

Salut!
 
Etant un tout jeune développeur PHP autodidcate, je me rends bien compte que je fais beaucoup de boulettes, et notamment que je ne structure pas mon code comme je devrais le faire.
 
Par exemple, je suis pas un adepte des fonctions alors qu'elles me simplifieraient bien la vie. Ensuite, je me rends bien compte que je réécris certains fragments de code plein de fois alors qu'il devrait y avoir moyen de le ne faire qu'une bonne fois pour toute. Mais comme la logique PHP-esque ne baigne pas encore mon esprit fatigué, ca ne me vient pas tout de suite :D
 
Donc puisqu'il s'agit ici de conseils d'optimisation, je vous suggère d'éventuellement donner quelques pistes de ce côté là, et vous garantit qu'y en a au moins un à qui ça servira :D
 
Merci!


Dans ton cas, il y a deux approches possibles :
soit tu utilises plusieurs fois le même code dans un script, soit tu utilises plusieurs fois le même code dans des scrits différents.
Dans le premier cas, tu crées la fonction en haut de ton script et tu y fais appel à chaque fois que tu en as besoin.
Dans le deuxième cas, tu crées un fichier dans lequel tu réunies tes fonctions puis tu l'appelles dans les scripts qui nécessitent ces fonctions en intégrant un require("fonctions.php" ); .Ensuite, tu peux utiliser les fonctions comme si elles avaient été créées dans le script.


Message édité par nero27 le 26-07-2005 à 13:45:18
Reply

Marsh Posté le 26-07-2005 à 13:47:31    

Et c'est pas mieux de faire la deuxième solution tout de suite?? Comme ça si un jour on veux réutiliser la fonction (dans son premier cas) on est obliger de retrouver la page sur laquelle on utilisait cette dernière,etc ,etc..  
 
Enfin je sais pas, c'est quoi la différence??

Reply

Marsh Posté le 26-07-2005 à 13:59:30    

La 1ere est l'equivalent pas futé de la 2ème :p.
 
Parcontre utiliser les fonction (ou methodes) est autant utile que dangeureux ... Un debutant qui utilisera des fonction bloquera avec 80% de probabilité a des problemes de portée de variables, qu'il resoudra en foutant toutes ses variables en globales ou pire super-globales, ce qui sera tout autan stupide que d'avoir recopier 50 fois son code


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-07-2005 à 13:59:39    

micfont999 a écrit :

Et c'est pas mieux de faire la deuxième solution tout de suite?? Comme ça si un jour on veux réutiliser la fonction (dans son premier cas) on est obliger de retrouver la page sur laquelle on utilisait cette dernière,etc ,etc..  
 
Enfin je sais pas, c'est quoi la différence??


Faut voir si la fonction en question est générique et réutilisable.  [:airforceone]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 26-07-2005 à 14:01:35    

Oui ok, c'est vrai que si le fichier de connexion est blindé de fonctions inutiles, ça ralentira pas mal le script.. Non..?

Reply

Marsh Posté le 26-07-2005 à 14:18:01    

nero27 a écrit :

Dans ton cas, il y a deux approches possibles :
soit tu utilises plusieurs fois le même code dans un script, soit tu utilises plusieurs fois le même code dans des scrits différents.
Dans le premier cas, tu crées la fonction en haut de ton script et tu y fais appel à chaque fois que tu en as besoin.
Dans le deuxième cas, tu crées un fichier dans lequel tu réunies tes fonctions puis tu l'appelles dans les scripts qui nécessitent ces fonctions en intégrant un require("fonctions.php" ); .Ensuite, tu peux utiliser les fonctions comme si elles avaient été créées dans le script.


 
 
Pour prendre un exemple concret, je pensais à la déclaration de mes variables suite à des formulaires. Pour le moment, je me tape à chaque fois le  
 

if(isset($HTTP_POST_VARS['variable']))
 $variable=$HTTP_POST_VARS['variable'];
else $variable="";


 
Je me rends bien compte que c'est stupide de refaire tout ca manuellement à chaque fois et qu'une fonction (merci micfont999 :D) serait bien plus adaptée. Mais voilà, ca je m'en rends compte après avoir farci 25 pages de lignes de code redondantes :D
 
Cela dit pour ce cas-là, je vais m'y atteler :D
 

Reply

Marsh Posté le 26-07-2005 à 14:19:46    

Tu peux toujours le faire pour tes prochains sites :) :D et laisser celui la tout moche au niveau du code :D (ok je sort)

Reply

Marsh Posté le 26-07-2005 à 14:21:36    

Nan justement, cui-là va me servir de site "chef d'oeuvre" pour valider mon diplôme, alors faut que le code soit un minimum bien pensé :D (même si pour ce foutu diplôme j'ai pas eu de vrais cours de php - 4 heures à faire des echo, c'est un peu léger)

Reply

Marsh Posté le 26-07-2005 à 14:24:59    

Voui effectivement vu sous cet angle... :) enfin ne nous éloignons pas trop du sujet :D

Reply

Marsh Posté le 26-07-2005 à 14:27:25    

Heu un conseil, evite le HTTP_*_VARS, c'est $_POST , $_GET ,... depuis un petit bout de temps ...


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 26-07-2005 à 14:29:16    

Vi, merci. J'ai copié collé ca d'une page ou j'ai pas encore fait cette modif, mais on m'avait déjà fait la remarque :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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