Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 15/11/2003, 23h03   #1
DgG
Invité régulier
 
Inscription : novembre 2003
Messages : 22
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 22
Points : 7
Points : 7
Envoyer un message via ICQ à DgG Envoyer un message via AIM à DgG Envoyer un message via MSN à DgG
Par défaut Optimisation de scripts PHP/MySQL

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.
DgG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/11/2003, 23h44   #2
stephane eyskens
Rédacteur

 
Inscription : septembre 2002
Messages : 1 580
Détails du profil
Informations personnelles :
Âge : 37

Informations forums :
Inscription : septembre 2002
Messages : 1 580
Points : 3 885
Points : 3 885
Par défaut conseils

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
stephane eyskens est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/11/2003, 01h45   #3
hachesse
Membre éprouvé
 
Avatar de hachesse
 
Inscription : mars 2002
Messages : 189
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 189
Points : 439
Points : 439
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
hachesse est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2003, 13h59   #4
djibxav
Membre confirmé
 
Développeur informatique
Inscription : février 2003
Messages : 143
Détails du profil
Informations personnelles :
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2003
Messages : 143
Points : 223
Points : 223
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).
djibxav est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/12/2003, 13h30   #5
DgG
Invité régulier
 
Inscription : novembre 2003
Messages : 22
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 22
Points : 7
Points : 7
Envoyer un message via ICQ à DgG Envoyer un message via AIM à DgG Envoyer un message via MSN à DgG
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 ?
DgG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2003, 01h21   #6
VincentMetz
Invité de passage
 
Inscription : décembre 2003
Messages : 2
Détails du profil
Informations forums :
Inscription : décembre 2003
Messages : 2
Points : 1
Points : 1
Par défaut passage PHP / HTML ?

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
VincentMetz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2003, 22h49   #7
MagicKing
En attente de confirmation mail
 
Inscription : octobre 2003
Messages : 2
Détails du profil
Informations forums :
Inscription : octobre 2003
Messages : 2
Points : 2
Points : 2
Envoyer un message via MSN à MagicKing
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
MagicKing est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2003, 12h22   #8
Dozer
Invité régulier
 
Inscription : juin 2002
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 12
Points : 9
Points : 9
Utilier les décalages à droite ou à gauche sur les bits ( << et >> ) pour diviser ou multiplier par deux .
Dozer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2003, 12h36   #9
Dozer
Invité régulier
 
Inscription : juin 2002
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 12
Points : 9
Points : 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 .
Dozer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2003, 23h55   #10
DgG
Invité régulier
 
Inscription : novembre 2003
Messages : 22
Détails du profil
Informations forums :
Inscription : novembre 2003
Messages : 22
Points : 7
Points : 7
Envoyer un message via ICQ à DgG Envoyer un message via AIM à DgG Envoyer un message via MSN à DgG
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
DgG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2003, 13h57   #11
Dozer
Invité régulier
 
Inscription : juin 2002
Messages : 12
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 12
Points : 9
Points : 9
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;
Dozer est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2003, 09h20   #12
ermelir
Membre régulier
 
Homme Matthieu
Consultant informatique
Inscription : janvier 2003
Messages : 134
Détails du profil
Informations personnelles :
Nom : Homme Matthieu
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 134
Points : 82
Points : 82
Par défaut Re: Optimisation de scripts Php/MySQL

Citation:
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
__________________
blog : http:blog.kyp.fr
ermelir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/12/2003, 19h25   #13
iubito
Membre expérimenté
 
Avatar de iubito
 
Homme Sylvain Machefert
Développeur Java
Inscription : janvier 2003
Messages : 380
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Machefert
Âge : 30
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Développeur Java
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 380
Points : 591
Points : 591
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
__________________
Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 09h51   #14
_Gabriel_
Membre à l'essai
 
Inscription : septembre 2003
Messages : 27
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 27
Points : 20
Points : 20
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
    Citation:
    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.

ici 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
++
_Gabriel_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 09h59   #15
iubito
Membre expérimenté
 
Avatar de iubito
 
Homme Sylvain Machefert
Développeur Java
Inscription : janvier 2003
Messages : 380
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Machefert
Âge : 30
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Développeur Java
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 380
Points : 591
Points : 591
Citation:
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à...
__________________
Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 10h02   #16
iubito
Membre expérimenté
 
Avatar de iubito
 
Homme Sylvain Machefert
Développeur Java
Inscription : janvier 2003
Messages : 380
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Machefert
Âge : 30
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Développeur Java
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 380
Points : 591
Points : 591
Autre chose : bien lire la doc PHP

les fonctions highlight_string, show_source et 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();
__________________
Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 10h09   #17
ermelir
Membre régulier
 
Homme Matthieu
Consultant informatique
Inscription : janvier 2003
Messages : 134
Détails du profil
Informations personnelles :
Nom : Homme Matthieu
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Consultant informatique
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : janvier 2003
Messages : 134
Points : 82
Points : 82
Citation:
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...
__________________
blog : http:blog.kyp.fr
ermelir est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 10h17   #18
_Gabriel_
Membre à l'essai
 
Inscription : septembre 2003
Messages : 27
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 27
Points : 20
Points : 20
Citation:
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.
++
_Gabriel_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 10h42   #19
iubito
Membre expérimenté
 
Avatar de iubito
 
Homme Sylvain Machefert
Développeur Java
Inscription : janvier 2003
Messages : 380
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Machefert
Âge : 30
Localisation : France, Haute Loire (Auvergne)

Informations professionnelles :
Activité : Développeur Java
Secteur : Finance

Informations forums :
Inscription : janvier 2003
Messages : 380
Points : 591
Points : 591
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.
__________________
Lé SMS cé kom lé ognon, sa pike lé yeu
iubito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/12/2003, 10h46   #20
_Gabriel_
Membre à l'essai
 
Inscription : septembre 2003
Messages : 27
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 27
Points : 20
Points : 20
Citation:
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)

++
_Gabriel_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h40.


 
 
 
 
Partenaires

Hébergement Web