Publicité
+ Répondre à la discussion
Page 1 sur 19 1234511 ... DernièreDernière
Affichage des résultats 1 à 20 sur 369
  1. #1
    DgG
    DgG est déconnecté
    Invité régulier
    Inscrit en
    novembre 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 22
    Points : 7
    Points
    7

    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.

  2. #2
    Rédacteur


    Inscrit en
    septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : septembre 2002
    Messages : 1 581
    Points : 3 891
    Points
    3 891

    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

  3. #3
    Membre expérimenté
    Avatar de hachesse
    Inscrit en
    mars 2002
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : mars 2002
    Messages : 189
    Points : 543
    Points
    543

    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

  4. #4
    Membre confirmé
    Profil pro
    Développeur informatique
    Inscrit en
    février 2003
    Messages
    144
    Détails du profil
    Informations personnelles :
    Âge : 36
    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 : 144
    Points : 228
    Points
    228

    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).

  5. #5
    DgG
    DgG est déconnecté
    Invité régulier
    Inscrit en
    novembre 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 22
    Points : 7
    Points
    7

    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 ?

  6. #6
    Invité de passage
    Inscrit en
    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

  7. #7
    En attente de confirmation mail
    Inscrit en
    octobre 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : octobre 2003
    Messages : 2
    Points : 2
    Points
    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

  8. #8
    Invité régulier
    Inscrit en
    juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 12
    Points : 9
    Points
    9

    Par défaut

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

  9. #9
    Invité régulier
    Inscrit en
    juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 12
    Points : 9
    Points
    9

    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 :
    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 .

  10. #10
    DgG
    DgG est déconnecté
    Invité régulier
    Inscrit en
    novembre 2003
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : novembre 2003
    Messages : 22
    Points : 7
    Points
    7

    Par défaut

    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

  11. #11
    Invité régulier
    Inscrit en
    juin 2002
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : juin 2002
    Messages : 12
    Points : 9
    Points
    9

    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 :
    1
    2
    3
    4
    5
    6
    echo <<< PTR
    ligne1
    ligne2
    ligne3
    ...
    PTR;

  12. #12
    Membre régulier
    Homme Profil pro Matthieu
    Consultant informatique
    Inscrit en
    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

  13. #13
    Membre chevronné
    Avatar de iubito
    Homme Profil pro Sylvain Machefert
    Développeur Java
    Inscrit en
    janvier 2003
    Messages
    385
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain Machefert
    Âge : 31
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 385
    Points : 627
    Points
    627

    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
    Lé SMS cé kom lé ognon, sa pike lé yeu

  14. #14
    Futur Membre du Club
    Inscrit en
    septembre 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 27
    Points : 19
    Points
    19

    Par défaut

    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.


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

  15. #15
    Membre chevronné
    Avatar de iubito
    Homme Profil pro Sylvain Machefert
    Développeur Java
    Inscrit en
    janvier 2003
    Messages
    385
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain Machefert
    Âge : 31
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 385
    Points : 627
    Points
    627

    Par défaut

    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

  16. #16
    Membre chevronné
    Avatar de iubito
    Homme Profil pro Sylvain Machefert
    Développeur Java
    Inscrit en
    janvier 2003
    Messages
    385
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain Machefert
    Âge : 31
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 385
    Points : 627
    Points
    627

    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 :
    $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

  17. #17
    Membre régulier
    Homme Profil pro Matthieu
    Consultant informatique
    Inscrit en
    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

    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

  18. #18
    Futur Membre du Club
    Inscrit en
    septembre 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 27
    Points : 19
    Points
    19

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

  19. #19
    Membre chevronné
    Avatar de iubito
    Homme Profil pro Sylvain Machefert
    Développeur Java
    Inscrit en
    janvier 2003
    Messages
    385
    Détails du profil
    Informations personnelles :
    Nom : Homme Sylvain Machefert
    Âge : 31
    Localisation : France, Haute Loire (Auvergne)

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

    Informations forums :
    Inscription : janvier 2003
    Messages : 385
    Points : 627
    Points
    627

    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.
    Lé SMS cé kom lé ognon, sa pike lé yeu

  20. #20
    Futur Membre du Club
    Inscrit en
    septembre 2003
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : septembre 2003
    Messages : 27
    Points : 19
    Points
    19

    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)

    ++

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •