Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de donn�es Discussion :

Optimisation de scripts PHP/MySQL [D�bat]


Sujet :

PHP & Base de donn�es

  1. #1
    DgG
    DgG est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 22
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    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. #2
    Membre Expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    D�tails du profil
    Informations personnelles :
    �ge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    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
      0  0

  3. #3
    Membre chevronn�
    Avatar de hachesse
    Inscrit en
    Mars 2002
    Messages
    189
    D�tails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 189
    Par d�faut
    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. #4
    Membre exp�riment�
    Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2003
    Messages
    152
    D�tails du profil
    Informations personnelles :
    �ge : 47
    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 : 152
    Par d�faut
    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. #5
    DgG
    DgG est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 22
    Par d�faut
    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. #6
    Nouveau candidat au Club
    Inscrit en
    D�cembre 2003
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : D�cembre 2003
    Messages : 2
    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
      0  0

  7. #7
    Nouveau candidat au Club
    Inscrit en
    Octobre 2003
    Messages
    2
    D�tails du profil
    Informations forums :
    Inscription : Octobre 2003
    Messages : 2
    Par d�faut
    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. #8
    Membre habitu�
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Par d�faut
    Utilier les d�calages � droite ou � gauche sur les bits ( << et >> ) pour diviser ou multiplier par deux .
      0  0

  9. #9
    Membre habitu�
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Par d�faut
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    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. #10
    DgG
    DgG est d�connect�
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    22
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 22
    Par d�faut
    Ouaw g�nial, je connaisait pas le IN () !!! c trop bien �a !!
    sinan ca sert a koi ca ?
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    $_POST['check_'.$i] == 1 au lieu de $_POST['check_'.$i] == on
    M'en veut po Dozer
      0  0

  11. #11
    Membre habitu�
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Par d�faut
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    echo <<< PTR
    ligne1
    ligne2
    ligne3
    ...
    PTR;
      0  0

  12. #12
    Membre confirm�
    Homme Profil pro
    Charg� d'affaire
    Inscrit en
    Janvier 2003
    Messages
    133
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : Charg� d'affaire
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 133
    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
      0  0

  13. #13
    Membre �clair�
    Avatar de iubito
    Homme Profil pro
    D�veloppeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Par d�faut
    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. #14
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Par d�faut
    salut,

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

      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      for($i=0;$i<sizeof($arr);$i++)
      ca c'est pas bon!!!
      il vaut mieux
      Code : S�lectionner tout - Visualiser dans une fen�tre � part
      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.


    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
    ++
      0  0

  15. #15
    Membre �clair�
    Avatar de iubito
    Homme Profil pro
    D�veloppeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Par d�faut
    Citation Envoy� par _Gabriel_
    salut,

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

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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. #16
    Membre �clair�
    Avatar de iubito
    Homme Profil pro
    D�veloppeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Par d�faut
    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 : S�lectionner tout - Visualiser dans une fen�tre � part
    $contenu = show_source('fichier.php', TRUE);
    est �quivalent, mais beaucoup plus rapide que :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    ob_start();
    show_source ( 'fichier.php' );
    $contenu = ob_get_contents();
    ob_end_clean();
      0  0

  17. #17
    Membre confirm�
    Homme Profil pro
    Charg� d'affaire
    Inscrit en
    Janvier 2003
    Messages
    133
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyr�n�es Atlantiques (Aquitaine)

    Informations professionnelles :
    Activit� : Charg� d'affaire
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Janvier 2003
    Messages : 133
    Par d�faut
    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...
      0  0

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Par d�faut
    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.
    ++
      0  0

  19. #19
    Membre �clair�
    Avatar de iubito
    Homme Profil pro
    D�veloppeur Java
    Inscrit en
    Janvier 2003
    Messages
    389
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activit� : D�veloppeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Par d�faut
    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. #20
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Par d�faut
    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

Discussions similaires

  1. [D�butant] Acc�l�rer et optimiser ses scripts PHP
    Par Metallic-84s dans le forum Langage
    R�ponses: 6
    Dernier message: 24/03/2006, 12h37
  2. [MySQL] [SGBD] Script PHP/MYSQL d'access FTP
    Par ChRom dans le forum PHP & Base de donn�es
    R�ponses: 1
    Dernier message: 09/01/2006, 01h52
  3. R�ponses: 9
    Dernier message: 05/01/2006, 12h24
  4. Recherche Login Script PHP & MySQL
    Par whbh dans le forum SQL Proc�dural
    R�ponses: 9
    Dernier message: 01/12/2005, 16h45
  5. [MySQL] [Script]Optimisation de scripts Php/MySQL (2)
    Par copy dans le forum PHP & Base de donn�es
    R�ponses: 8
    Dernier message: 27/08/2004, 08h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo