IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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 à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 22
    Points : 11
    Points
    11
    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.
    Webmaster de http://www.bebevallee.com
    Je programe en PHP/MySQL, je m'occupe de :
    http://www.cannavallee.com } Simulation de
    culture.
    http://www.bultin.com } Bulletin de notes
    scolaire en ligne.
    http://www.metaladept.com } Sur la Musik, le Métal !
    http://bearzone.free.fr } Vieux site perso.

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    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 éclairé
    Avatar de hachesse
    Inscrit en
    Mars 2002
    Messages
    189
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 189
    Points : 651
    Points
    651
    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 actif
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2003
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 46
    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
    Points : 248
    Points
    248
    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é
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 22
    Points : 11
    Points
    11
    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 ?
    Webmaster de http://www.bebevallee.com
    Je programe en PHP/MySQL, je m'occupe de :
    http://www.cannavallee.com } Simulation de
    culture.
    http://www.bultin.com } Bulletin de notes
    scolaire en ligne.
    http://www.metaladept.com } Sur la Musik, le Métal !
    http://bearzone.free.fr } Vieux site perso.

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2003
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 2
    Points : 2
    Points
    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

  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
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 12
    Points
    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 &#40;$i = 0; $i < $max; $i++&#41;
    # le max représente l'id maximum des entrées de la table, a vous de voir comment vous la récupérez
    &#123;
    if &#40;$_POST&#91;'check_'.$i&#93; == on&#41; mysql_query&#40;"DELETE FROM table WHERE id = '$i'"&#41;;
    &#125;
    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 &#40;";
     
    for &#40;$i = 0; $i < $max; $i++&#41;
    # le max représente l'id maximum des entrées de la table, a vous de voir comment vous la récupérez
    &#123;
    if &#40;$_POST&#91;'check_'.$i&#93; == on&#41; $query .= "'$i',";
    &#125;
     
    $query = substr&#40;$query, 0, strlen&#40;$query&#41; - 2&#41; . "&#41;";
    mysql_query&#40;$query&#41;;
    Cela ne fait qu'une seule requete, donc gros gain de performances .

  10. #10
    DgG
    DgG est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 22
    Points : 11
    Points
    11
    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
    Webmaster de http://www.bebevallee.com
    Je programe en PHP/MySQL, je m'occupe de :
    http://www.cannavallee.com } Simulation de
    culture.
    http://www.bultin.com } Bulletin de notes
    scolaire en ligne.
    http://www.metaladept.com } Sur la Musik, le Métal !
    http://bearzone.free.fr } Vieux site perso.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 12
    Points : 12
    Points
    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;

  12. #12
    Membre régulier
    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
    Points : 101
    Points
    101
    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

  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 : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    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
    Membre éclairé, lol !

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Points : 30
    Points
    30
    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&#40;$i=0;$i<sizeof&#40;$arr&#41;;$i++&#41;
      ca c'est pas bon!!!
      il vaut mieux
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
       
      $j = sizeof&#40;$arr&#41;;
      for&#40;$i=0;$i<$j;$i++&#41;
      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 é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 : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    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&#40;$i=0;$i<sizeof&#40;$arr&#41;;$i++&#41;
    ca c'est pas bon!!!
    peux-tu préciser un peu, je capte pas là...
    Membre éclairé, lol !

  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 : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    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&#40;'fichier.php', TRUE&#41;;
    est équivalent, mais beaucoup plus rapide que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ob_start&#40;&#41;;
    show_source &#40; 'fichier.php' &#41;;
    $contenu = ob_get_contents&#40;&#41;;
    ob_end_clean&#40;&#41;;
    Membre éclairé, lol !

  17. #17
    Membre régulier
    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
    Points : 101
    Points
    101
    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...

  18. #18
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Points : 30
    Points
    30
    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 é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 : 41
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Janvier 2003
    Messages : 389
    Points : 655
    Points
    655
    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.
    Membre éclairé, lol !

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 27
    Points : 30
    Points
    30
    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)

    ++

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, 13h37
  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, 02h52
  3. Réponses: 9
    Dernier message: 05/01/2006, 13h24
  4. Recherche Login Script PHP & MySQL
    Par whbh dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 01/12/2005, 17h45
  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, 09h33

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