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. #141
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Optimise ton script ...
    Testez le forum Fire Soft Board, un forum libre, gratuit et français.

    Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.

  2. #142
    Candidat au Club
    Inscrit en
    Mars 2005
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    L'optimisation n'est pas évidente.

    Peux t on grouper en mysql un envoi de requetes ?
    En fait mon script fais 60 fois la meme étape (calculs divers) pour à chaque fois faire un update d'une ligne d'une table (ligne différente à chaque fois)

    Peut etre serait il possible d'atttendre d'avoir toutes les requetes pour les envoyer en une fois à la base ?

  3. #143
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Tu peux faire un copie colle de ton script ici qu'on voye ce qu'il y a a optimiser ?
    Testez le forum Fire Soft Board, un forum libre, gratuit et français.

    Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.

  4. #144
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    J'ai eut besoin il y a quelques jours de tester si la solution utilisant MySQL était plus rapide que la solution utilisant PHP.

    Ma question était de tester si une ligne existait dans une table. Il ne pouvait y avoir au maximum qu'une seul ligne.
    Donc vallait-il mieux sélectionner la ligne et tester son existance avec mysql_num_rows(), ou alors utiliser la fonction COUNT() de MySQL, puis ensuite récupérer un tableau avec mysql_fetch_array puis en extraite la valeur voulue ?

    Pour répondre à cette question j'ai réalisé un benchmark
    Résultat (pour ma machine) : une moyenne de 22 ms pour le mysql_num_rows contre 15ms pour COUNT.
    (Pour ce test j'ai réalisé 100000 itérations allant de la requête jusqu'a la récupération concrète du nombre de ligne.)


    Maintenant ça peut parraitre un peu bêtat de dire que c'est plus rapide en utilisant les fonction de mysql, mais à l'origine cette question ne m'a pas parru évidente.

    Je pense donc que ceci est généralisable à la plus part des cas : préférer la solution MySQL lorsque vous avez le choix entre une solution MySQL et PHP.


    J'en profite pour poser une petite question : vaut-il mieux stoquer dans une bdd les dates sous formes d'unix timestamp (dans un champ de type INT) ou un des formats de date de mysql ?
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  5. #145
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Benchmark est ton ami dans ce cas
    Testez le forum Fire Soft Board, un forum libre, gratuit et français.

    Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.

  6. #146
    Membre éclairé
    Avatar de Kioob
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Points : 764
    Points
    764
    Par défaut
    Citation Envoyé par Celelibi
    J'en profite pour poser une petite question : vaut-il mieux stoquer dans une bdd les dates sous formes d'unix timestamp (dans un champ de type INT) ou un des formats de date de mysql ?
    Si tu utilises le format DATE de MySQL, tu pourras faire un grand nombre de calcul directement via MySQL. Et si besoin, tu pourras quand même récupèrer le timestamp UNIX, via la fonction MySQL dédiée à cela.

    Par contre si tu stockes en timestamp, tu vas être fortement limité question calculs, et un grand nombre de taches risque d'etre relégué à PHP.
    Google is watching you !

  7. #147
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    DATETIME plutot non ?
    Sinon tu perd les infos heures/minutes/secondes

    La doc mysql est ton amie aussi, très intéressante je trouve :
    http://dev.mysql.com/doc/mysql/en/da...functions.html

    Existe même en francais :]
    http://dev.mysql.com/doc/mysql/fr/da...functions.html

  8. #148
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Bonsoir,

    Si je veux accèder à n données, uniques, mais accèdées à chaque execution d'un script, vaut il mieux créer une table mysql rien que pour stocker ces n données, ou utiliser un fichier à la place ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $Variables = file('variables');
    ...
    $v_i = $Variables[i];
    ...
    $Variables[m] = $v_m;
    ...
    $Fichier = fopen('variables','a');
    fwrite ($Fichier, join("\n", $Variables));
    fclose($Fichier);
    Ou un genre de schéma similaire ?

  9. #149
    Membre éclairé
    Avatar de genova
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 487
    Points : 790
    Points
    790
    Par défaut
    Si tu utilises énormément de SELECT de ton fichier (c'est à dire de lecture) et que tu utilises relativement peut d'écriture (UPDATE, INSERT) je te conseil de passer par un fichier, mais stoque ces fichiers sous forme de tableau PHP avec var_export().

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    $ary = array&#40;
       0 => array&#40;
          'champ1' => 'valeur1',
          'champ2' => 'valeur2'
       &#41;,
       1 => array&#40;
          'champ1' => 'valeur1',
          'champ2' => 'valeur2'
       &#41;,
       2 => array&#40;
          'champ1' => 'valeur1',
          'champ2' => 'valeur2'
       &#41;,
    &#41;;
    ?>
    Un simple include() et hop le tour est joué.



    A part ça j'ai effectué un benchmark qui m'a largement surpris. J'ai fait une fonction de test qui recoit de trois facon un tableau de 1000 éléments. Il recoit ce tableau en paramètre lors du premier test, lors du second test en global, lors du troisième par référence.

    Je fais une itération de 10000 tour avec appel de fonction, le résultat est sans appel :
    passage du tableau en argument : 5.0572290420532 secondes
    passage par globalisation : 0.026066064834595 secondes
    Passage par référence : 0.024504899978638 secondes


    Voici le code utilisé pour le passage en argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    include&#40;'function.php'&#41;;
    include&#40;'class_benchmark.php'&#41;;
    $ary = array&#40;&#41;;
    for &#40;$i = 0; $i < 1000; $i++&#41;
    &#123;
       $ary&#91;$i&#93; = $i * $i;
    &#125;
    function test&#40;$ary&#41;
    &#123;
       $ary&#91;0&#93;++;
    &#125;
    $bench = new bench&#40;&#41;;
    for &#40;$i = 0; $i < 10000; $i++&#41;
    &#123;
       test&#40;$ary&#41;;
    &#125;
    $bench->finish&#40;&#41;;
    ?>
    J'en conclu qu'il faut fortement éviter de passer des grosses données par argument à sa fonction (ce qui parait logiquie car toute la mémoirre alouée pour cet élément est passée à la fonction).
    Testez le forum Fire Soft Board, un forum libre, gratuit et français.

    Système de template de phpBB - Lisez la FAQ PHP avant toute question si vous débuttez en PHP.

  10. #150
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    J'ai du mal m'exprimer. Je voulais dire n variables :

    Variable 1
    Variable 2
    ...
    Variable n

    qu'on peut coder en mysql comme une table avec deux champs "Nom Variable" et "Valeur" (ou en une seule ligne ^^ mais c'est pas beau)

  11. #151
    Futur Membre du Club
    Inscrit en
    Janvier 2004
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par dark_genova
    Je fais une itération de 10000 tour avec appel de fonction, le résultat est sans appel :
    passage du tableau en argument : 5.0572290420532 secondes
    passage par globalisation : 0.026066064834595 secondes
    Passage par référence : 0.024504899978638 secondes
    effectivement, c assez impressionant ..

  12. #152
    Membre régulier
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par dark_genova
    J'en conclu qu'il faut fortement éviter de passer des grosses données par argument à sa fonction (ce qui parait logiquie car toute la mémoirre alouée pour cet élément est passée à la fonction).
    ??
    C'est surtout parce que dans une fonction, PHP travaille sur des copies des variables passées en paramètre (donc si tu passes un bon gros tableau en paramètre, PHP va devoir le copier)

  13. #153
    ALkyD
    Invité(e)
    Par défaut
    Salut,

    j'ai une question qui me turlupine :

    Dois-je systématiquement activer la compression GZip ? Je voudrais savoir si elle correspond à un type de sites particuliers, ou bien si elle est efficace dans tous les cas ?

    Je suis en train de faire un projet à la SPIP, et je me demande simplement si je dois faire une constante GZIP pour activer ou non la compression HTTP...

    Merci de votre aide.

  14. #154
    131
    131 est déconnecté
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Pourquoi alors ne pas travailler qu'avec des référence ?
    Est-ce un reflexe à prendre ?

  15. #155
    Membre régulier
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Mai 2005
    Messages
    112
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Mai 2005
    Messages : 112
    Points : 115
    Points
    115
    Par défaut
    Citation Envoyé par iubito
    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à...
    A chaque tour dans la boucle tu calcule le alors en le sortant avant la boucle tu le calcule une fois pour toutes.
    Au bout de la boucle tu aurra economisé du temps...

  16. #156
    Membre régulier
    Avatar de titoon
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 71
    Points : 86
    Points
    86
    Par défaut
    Citation Envoyé par jcachico
    Citation Envoyé par iubito
    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à...
    A chaque tour dans la boucle tu calcule le alors en le sortant avant la boucle tu le calcule une fois pour toutes.
    Au bout de la boucle tu aurra economisé du temps...
    Pour info, il existe en PHP une boucle tout spécialement prévue pour parcourir les tableaux... cf foreach
    Et quelques notes en plus sur les différentes boucles

  17. #157
    Nouveau membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Avril 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2005
    Messages : 19
    Points : 32
    Points
    32
    Par défaut
    oui mais il arrive qu'on ne veuille pas les deux premières cases du tableau...dans ce cas un for est bien pratique.

  18. #158
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Si j'ai deux tables A et B, et je veux selectionner des enregistrements de A, et quelques enregistrement de B associés. Du style

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM A LEFT OUTER JOIN B ON A.Id = B.Id AND A.Cle = 'Constante'
    Vaut il mieux faire réelement la jointure externe, ou vaut il mieux tout rappattrier par une jointure interne, et trier après ce que je garde ou non dans chaque enregistrement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ... FROM A  JOIN B ON A.Id = B.Id
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $Enregistrement = mysql_fetch_array&#40;&#41;;
     
    if &#40;$Enregistrement&#91;Cle&#93; == 'Constante'&#41;
      ...
    else
      ...

  19. #159
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2005
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 12
    Points : 16
    Points
    16
    Par défaut
    Bonjour,


    Interessant ce sujet. Je l'ai trouvé en cherchant justement quel était le plus rapide entre un while et un foreach.

    J'ai beaucoup vu que vous parliez de libérer la mémoire du server, mais celà se fait au détriment du CPU non ?

    Donc faut il vraiment détruire les variables temporaires à chaque fois, et libérer les résult Mysql, ce qui libère de la mémoire mais utilise le CPU à chaque appel de fonction ?

    J'apporte ma pierre à l'édifice. Enfin... Disons mon petit caillou plutôt, mais c'est l'intention qui compte ^^ :

    Lorsque vous devez compter un nombre d'enregistrement d'une table compotant un champ 'id', et que cette table ne subit jamais d'effacement (table contenant chaque connection au site par exemple, pour faire un compteur avec stats sur le pays etc.) plutôt que de faire un Where 1 et compter le nombre de lignes retournées, faites un Where 1 order by id desc limit 0,1

    L'id retourné est le dernier et correspond au nombre d'enregistrement puisque dans ce genre de table aucun n'est supprimé. Donc un seul enregistrement retourné au lieu de tous.

  20. #160
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Il est très difficile de faire les bons tests de rapidités. Beaucoup de tests sur internet montrent que pour charger le contenu d'un fichier la fonction file_get_content est la plus rapide. En pratique, fgets peut être de 20 % plus rapide à infiniement plus long suivant les paramètres. 20 % sur le chargement d'un gros fichier, ce n'est pas rien.

    Il y a toujours un tas de paramètres que l'on oublie, et l'optimisation n'est pas simple. Le pire est qu'elle dépend avant tout de la machine sur laquelle le script tourne. D'une machine à l'autre, d'une configuration à l'autre, les meilleures solutions ne seront pas toujours les mêmes.

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