Developpez.com

Le Club des Développeurs et IT Pro

PHP & Base de données : Optimisation de scripts PHP/MySQL

Répondre à la discussion

, #1

Salut ! J'ai été confronté avec un site qui était hebergé sur un serveur dédier à la lenteur d'execution des page en Php.
En étudiant les documentation Php MySQL nous avons réussit a accelerer considerablement la vietesse et augmenter le nombre d'internaute sconnectés en même temps sur le site.
Donc voila, je vous propose que l'on se disent des techniques pour accelerer Php.

Je commence : 8)
- Simplifier au maximum les boucle while(...).
- Utiliser le moin de variables possible, en effet tout les variables son stocké dans la ram (nan ?).
- Réduire au maximum le nombre d'acces à une base de donnée (c'est important ça)
Par exemple lorsque que vous avez une adition à faire :
Code :
1
2
3
4
5
6
7
8
9
10
au lieu de faire
$q=mysql_query("SELECT nombre FROM table WHERE condition");
$r=mysql_fetch_array($q);
$nombre=$r["nombre"] + $valeur;
msql_query("UPDATE table SET nombre = $nombre WHERE condition");
 
On ecrit cela :
mysql_query("UPDATE table SET nombre = nombre + $valeur WHERE condition");
Et oui ça mache ça !!
-Optimiser la structure de vos table MySQL(voir doc)

Enfin, regardez dans les documentations si il ny a pas une fonction Php ou MySQL qui remplaceraies votre script de bourin. De cette sorte, vous ne ferez plus soufrir votre serveur.

A vous maintenant de donner vos astuces, ou de poser des questions.
0 0

, #2

Je rajoute ceci:

- évitez les "select *" lorsque vous ne devez ramener qu'une ou deux colonnes de la table.

- Mettez des index sur les colonnes qui sont souvet dans les clauses "where", bon, faut pas non plus mettre des index à tout va car pour chaque insertion, l'index doit être mis à jour, d'où perte de performance. Il faut uniquement mettre des index sur des grosses tables et qui sont requêtées à 85% VS mise à jour.

- évitez les variables intermédiaires inutiles
0 0

, #3

Eviter toute opération unitile du type operation en 2 temps
$c = $a + $b;
$e = $c + d;
est plus lent que $e = $a + $b + $d;

D'une maniere générale, les optimisation possible pour une base de données sont ici : http://sqlpro.developpez.com/OptimSQL/SQL_optim.html

Ouvir 1 seule connection à la base de donnée et la fermée à la fin de la page, preferer le connect au pconnect

Utiliser des constantes plutot que des variables qui ne change pas (ex les login, mot de passe, host et nom de la base de données

Preferer la syntaxe simple pour les chaines de caratere (guillemets simples) qui ne sont pas analysées par l'interpreteur PHP contrairement a la syntaxe complexe (guillemets double ou syntaxe here doc)

Il y a aussi possibilité de mettre en cache les scripts PHP (ex php accelerator)

Il faut aussi penser a bien configurer le serveur que ce soit au niveau du materiel, du systeme d'exploitation ou du serveur http
0 0

, #4

Apprendre à faire des commandes SQL bien compliquées pour sortir un seul recordset avec toutes les infos necessaires (mais pas d'inutile), pour reduire d'autant les acces à la base.

Recement j'ai refais une page ou je fais 1 acces à la base qui me renvoie tte les infos dont j'ai besoin, contre 3 par entrée dans la version d'avant, un premier et 2 autres par passage dans la boucle du premier (le gars avait l'air de s'etre arreté à 'select * from table' en sql).
0 0

, #5

Ouai c'est bien vrais tout ça
J'ai une ptite question, comment on fait pour rajouter une variable dans un champ d'une base ?
pour les aditions on peut faire champ=champ+$nb
Mais pour du texte par exemple on peut le faire ?
genre (marche pas):
champ=champ.'text a rentrer'
Nan ?
0 0

, #6

Bonjour,

Puisqu'on parle d'optimisation des scripts PHP, voilà une question que je me suis toujours posé.

Lorsqu'on veut écrire du texte statique (typiquement les balises <table> ou <div>), est ce qu'il vaut mieux utiliser la commande ECHO ou arreter le script php ?

Pour une question de lisibilité du code, il m'arrive souvent d'utiliser des ECHO, afin de ne pas interrompre mon script (?> ... <?php) pour seulement une ou deux lignes ; mais je ne suis pas certain que ca soit bon pour les performances ?

Quelqu'un à un avis ?


Vincent
0 0

, #7

Si tu utilise des echo avec un texte statique privilege le '' plutot que ""

De plus si la mémoire occupetrop pensez à faire des unset(); qui libere la mémoire utilisé mais niveau performance je sais pas si c'est ça mais si le serveur est compilé avec l'option --memory-limit alors cette fonction peut-etre utile
0 0

, #8

Utilier les décalages à droite ou à gauche sur les bits ( << et >> ) pour diviser ou multiplier par deux .
0 0

, #9

Il arrive fréquement que l'on affiche un form qui liste toutes les entrées d'une table SQL et que l'on y associe une checkbox pour supprimer l'entrée si c'est coché
( je prend le cas le plus simple mais bien sur il peut y avoir plusieurs checkbox, ou alors un champ qui permet de modifier la valeur de l'entrée, etc .. .)
Si l'on nomme check_id chaque checkbox, avec id verifiant l'id de l'entrée dans la table .

Dans la page qui reçoit le formulaire,

on peut faire ceci

Code :
1
2
3
4
5
6
 
for ($i = 0; $i < $max; $i++)
# le max représente l'id maximum des entrées de la table, a vous de voir comment vous la récupérez
{
if ($_POST['check_'.$i] == on) mysql_query("DELETE FROM table WHERE id = '$i'");
}

cette solution est mauvaise parce qu'elle va générer une requete mysql par checkbox cochée, ce qui entraine des grosse perte de performances .

Mieux vaut faire

Code :
1
2
3
4
5
6
7
8
9
10
11
 
$query = "DELETE FROM table WHERE id IN (";
 
for ($i = 0; $i < $max; $i++)
# le max représente l'id maximum des entrées de la table, a vous de voir comment vous la récupérez
{
if ($_POST['check_'.$i] == on) $query .= "'$i',";
}
 
$query = substr($query, 0, strlen($query) - 2) . ")";
mysql_query($query);

Cela ne fait qu'une seule requete, donc gros gain de performances .
0 0

, #10

Ouaw génial, je connaisait pas le IN () !!! c trop bien ça !!
sinan ca sert a koi ca ?
Code :
query = substr($query, 0, strlen($query) - 2) . ")";

enfin ca fait koi plustot ?

Sinan pour les echo ou le stopage du script php (?>)
je pense qu'il faut utiliser ?> dés que on a un peut de texte a afficher sans trop de variable .
remarque on peut afficher les variables comme ceci : <?=$var?> lorsque le script php est coupé.

Sinan j'ai une aure question : faut t'il faire unset($var); des que l'on ne sert plus d'une variable par la suite. le fait d'executer la fonction unset() ne bouffe pas un peut de ressources ? faut voir si pour des variable ou on a mis casiment que dale dedan, c'est la peine de faire un unset() ...

Encore une chose ; je pense qu'il vaut mieu utiliser des nombres plustot que des chaines de caractère dans des variable
exemple :
Code php :
$_POST['check_'.$i] == 1 au lieu de $_POST['check_'.$i] == on

M'en veut po Dozer
0 0

, #11

La syntaxe officielle c'est "on" pour une checkbox cochée, je t'assure, fait un print_r($_POST); pour t'en assurer .

Sinon le substr() sur la $query, c'est pour retirer le ", " en trop bien sur.

Et pour afficher beaucoup de texte qui ne comporte pas de variables la meilleur solution c'est la syntaxe "here doc"

Code :
1
2
3
4
5
6
echo <<< PTR
ligne1
ligne2
ligne3
...
PTR;
0 0

, #12

Envoyé par DgG

A vous maintenant de donner vos astuces, ou de poser des questions.
- je rajouterais unset($objet) lorsque l'on utilise des objets
- j'ai aussi pu constater que pour des requetes compliquées le fait de liberer le resultset accelerait considerablement le script , la toujours avec unset
0 0

, #13

pour le <?=$var?> dit plus haut.
ça marche bien, mais la syntaxe <? ?> n'est pas valable sur tous les serveurs.
Donc si le script doit être distribué( projet sourceforge ou autre) il vaut mieux mettre <?php echo $var; ?>

c'est + long mais ça marche partout
0 0

, #14

salut,

  • les calculs répétés dans les boucles du style

    Code :
    for($i=0;$i<sizeof($arr);$i++)

    ca c'est pas bon!!!
    il vaut mieux
    Code :
    1
    2
    3
     
    $j = sizeof($arr);
    for($i=0;$i<$j;$i++)
    car on evite d'appeller la fonction à chaque itération
  • les fonctions ob_start et ob_en_flush au debut et à la fin d'un script, on l'air (retour d'experience) d'ameliorer la vitesse mais pas la charge mémoire
    The second issue is that in PHP 4, echoing multiple times is slower than storing everything in a string and echoing it in one call. This is because echo is an expensive operation that could involve sending TCP/IP packets to a HTTP client. Of course accumulating the string in $s has some scalability issues as it will use up more memory, so you can see a trade-off is involved here.
    An alternate way of speeding the above code would be to use output buffering. This will accumulate the output string internally, and send the output in one shot at the end of the script. This reduces networking overhead substantially at the cost of more memory and an increase in latency. In some of my code consisting entirely of echo statements, performance improvements of 15% have been observed.


http://phplens.com/lens/php-book/optimizing-debugging-php.php un tutorial en anglais sur les optimisations php assez complet qui pourrait peut etre, aprés accord de son auteur, être traduit et mis sur le site.
je suis volontaire
++
0 0

, #15

Envoyé par _Gabriel_
salut,

- les calculs répétés dans les boucles du style

Code :
for($i=0;$i<sizeof($arr);$i++)

ca c'est pas bon!!!
peux-tu préciser un peu, je capte pas là...
0 0

, #16

Autre chose : bien lire la doc PHP

les fonctions http://fr.php.net/highlight_string, http://fr.php.net/show_source et http://fr.php.net/highlight_file acceptent un paramètre supplémentaire optionnel, lorsqu'il vaut true le résultat est renvoyé, et non écrit directement.

Par exemple :
Code :
$contenu = show_source('fichier.php', TRUE);

est équivalent, mais beaucoup plus rapide que :
Code :
1
2
3
4
ob_start();
show_source ( 'fichier.php' );
$contenu = ob_get_contents();
ob_end_clean();
0 0

, #17

Envoyé par _Gabriel_


- ob_start et ob_end_flush ameliore aussi la vitesse du script.

++
heu, tu es sur que cela ameliore la vitesse du script?
j'ai toujours entendu dire que cela le relentissait, ce qui semblerait plus logique...
0 0

, #18

Envoyé par ermelir

heu, tu es sur que cela ameliore la vitesse du script?
j'ai toujours entendu dire que cela le relentissait, ce qui semblerait plus logique...
j'ai aussi vu l'inverse et d'aprés mes test c'est vrai. bon c'est pas /10 aussi mais on peut gagner 1 à 2 dixiemes de secondes.
++
0 0

, #19

je vois toujours pas le rapport en un sizeof($arr) et un ob_start machin.

Le ob_xxx c'est pour récupérer ou compresser... bref faire des choses sur le texte qui est en temps normal envoyé directement au navigateur.

Donc si dans ton for tu as beaucoup de echo trucs d'accord, mais je vois pas en quoi bufferizer la sortie autour d'un for accélèrerai.
0 0

, #20

je vois toujours pas le rapport en un sizeof($arr) et un ob_start machin.
parce qu'il n'y en as pas. c'etait deux idées differentes. ( présence des - devant chaque phrase)

++
0 0
Messages suivants
Répondre à la discussion