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. #161
    Membre averti
    Homme Profil pro
    D�veloppeur Web
    Inscrit en
    Juillet 2005
    Messages
    12
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 40
    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
    Par d�faut
    Bonjour,

    Un autre petit test sur l'affichage de chaines de caract�re avec variable et caract�res sp�ciaux.
    Ex�cut� 30 000 fois chacun :

    m�tode 1 : <?php echo "une chaine de caract�re avec $var dedans et caract�re sp�ciaux : \n\n" ; ?>
    dur�e : 0.20288

    m�tode 2 : <?php echo 'une chaine de caract�re avec '.$var.' dedans et caract�re sp�ciaux : '."\n\n" ; ?>
    dur�e : 0.076507

    m�tode 3 : <?php echo 'une chaine de caract�re avec ', $var, ' dedans et caract�re sp�ciaux : ', "\n\n" ; ?>
    dur�e : 0.062021
    L'echo avec virgules est donc pr�f�rable quelque soit les param�tres.

  2. #162
    R�dacteur

    Homme Profil pro
    Geek entrepreneur
    Inscrit en
    Novembre 2004
    Messages
    1 224
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Geek entrepreneur

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 224
    Par d�faut
    Ce petit script permet de bencher un site. Il est conseill� de commencer par des petites it�rations afin de ne pas boucler pendant des heures ^^

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
        // Inclusion des lib PEAR 
        // --------------------- 
        // récupération de l'os sur lequel on est
        // on en a besoin pour déterminer le séparateur utilisé dans le PATH
        if (strstr(PHP_OS, 'WIN') == FALSE) 
        {
        	$separateur = ':';
        } 
        else 
        { 
        	$separateur = ';';
        }
     
        // Inclusion des lib PEAR
        // ---------------------
        set_include_path(get_include_path() . $separateur . 'PEAR');
     
        // Le client pour les requêtes
        // ---------------------------
        require_once 'HTTP/Client.php'; 
     
        // Bench du site (classe PEAR)
        // ---------------------------
        require_once ('Timer.php');               
     
     
        // les liens normaux
        $tab_link = array ('http://localhost/localweb/test/index.php?page=news',
                           'http://localhost/localweb/test/index.php?page=tools',
                           'http://localhost/localweb/test/index.php?page=dossierindex',
                           'http://localhost/localweb/test/index.php?page=membres,
                           'http://localhost/localweb/test/index.php?page=autre);
     
     
        // Positionner le runtime assez haut pour ne pas être bloqué
        set_time_limit(0);    // six minute timeout
        ini_set("memory_limit","256M");
     
        // Début du bench
        // --------------
        $bench = new Benchmark_Timer(); 
        $bench->start();
     
        $client =& new HTTP_Client(); 
     
        $bench->start();
     
        $cpt=0;
        // Bench de chaque page
        foreach ($tab_link as $a_row )
        {
            $cpt++;
            $bench->setMarker('test:'.$cpt);
             for ($i=0;$i<10;$i++)
            {
                $res = $client->get ( $a_row );        
            }
            $bench->setMarker('test de ' . $a_row );
        }
     
        $bench->stop();        
        $bench->display();
    Il est possible d'en faire une fonction ou une classe, de rendre le nombre d'it�rations param�trables et de passer le tableau des liens a bencher en param�tre.
    Ca permet de voir quelles sont les parties du site qui prennent le plus de temps et de garder des traces de ces perfs pour pouvoir les comparer plus tard apr�s une modification par exemple.

  3. #163
    Membre �clair�
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Directeur technique
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Par d�faut
    Citation Envoy� par Squallynou
    Bonjour,

    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.
    un select max serait peut etre plsu conseille, non ?

  4. #164
    Membre exp�riment�
    Profil pro
    �tudiant
    Inscrit en
    Ao�t 2005
    Messages
    161
    D�tails du profil
    Informations personnelles :
    �ge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 161
    Par d�faut
    un
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    select count(*) from table
    c'est encore plus efficace (sur les tables myisam en tous cas)

  5. #165
    Membre �clair�
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (�le de France)

    Informations professionnelles :
    Activit� : Directeur technique
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Par d�faut
    oui, en cas d'un id manquant en plein milieu, c'est meme plus correct sinon c la meme chose voire moins en ressources mais je pinaille lol

  6. #166
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par d�faut
    et SELECT MAX(id) FROM table ? �a va pas?

  7. #167
    Membre �m�rite

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    657
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 657
    Par d�faut
    Salut,
    Il me semble avoir lu que MyISAM stocke le nombre d'enregistrement, dans tout les cas pour obtenir le nombre d'enregistrements, "SELECT COUNT(*) FROM table" devrait �tre la solution la plus rapide.

  8. #168
    Membre �m�rite
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Par d�faut
    Petite remarque amusante. La fonction array_map est lente. Il est plus rapide d'utiliser un parcours avec foreach, que d'appliquer map. Apparement, il est �galement plus rapide de donner un nom de fonction en param�tre plut�t qu'une fonction lamda cr�e avec create_function. A v�rifier ;) J'ai gagn� 40 % rien qu'en rempla�ant les fonctions map. Interessant pour une partie dont le temps d'execution se compte en secondes.

  9. #169
    Membre �clair�
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par d�faut redimenssionement image
    Je souhaite afficher des images sur une page.
    Les images p�sent environs 100ko chacune, je souhaite en afficher environs 30 par page.
    Si j'utilise le la librairie GD2 pour redimenssioner, est ce que les images seront r�duites cot� serveur en �tant mise dans le cache (qui, normalement r�duirait le poid des images), ou alors c'est un redimenssionement cot� client (style <IMG width="xx" height="xx">) ??

    Merci

  10. #170
    Invit� de passage
    Profil pro
    Inscrit en
    Ao�t 2005
    Messages
    1
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 1
    Par d�faut
    Bonjour,

    j'ai une table auteurs avec des attributs comme le nom, le pr�nom, le sexe...
    Chaque auteur est li� � plusieurs articles dans une table articles (1 article = 1 enregistrement).
    je veux ressortir tous les articles d'un auteur donn� ainsi que son nom, son pr�nom...

    Du point de vue de l'optimisation vaut-il mieux faire deux requ�tes (et occuper du temps processeur) ou bien faire une jointure, quitte � avoir dans la table du r�sultat les attributs de l'auteur r�p�t�s pour chaque article (et donc occuper de la m�moire) ?

    Sachant que pour l'exemple j'ai simplifi� � l'extr�me et que c'est beaucoup plus lourd en r�alit� (4 tables, entre 5 et 10 colones pour chaque table et jusqu'� plus d'une centaine d'enregistrements � ressortir).

    j'�sp�re �tre clair (il est tard)

    Merci d'avance.

  11. #171
    Membre chevronn�
    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
    Par d�faut
    Pour ce type de configuration il faut faire une jointure, c'est justement fait pour �a
    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.

  12. #172
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Ao�t 2005
    Messages
    7
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Ao�t 2005
    Messages : 7
    Par d�faut
    Je pense qu'on devrait refaire ce sujet... l� on a un paquet de posts, donc certains inutiles... j'ai pas eu le courage de tout lire...

    je vais donc peut �tre redire des choses d�ja indiqu�es, mais voila mes habitudes en mati�re d'optimisation



    Portabilit�
    - toujours utiliser la balise <?php au lieu du simple <?
    - inclure des conditions pour d�tecter si certaines fonctions (tels que les magic_quotes) sont actives, et faire un addslashes ou non en cons�quence

    �conomie de ressources
    - bannir le "SELECT *" de ses scripts... m�me si on prend la totalit� des champs, les nommer un par un, ce qui permet de s'y retrouver plus facilement par la suite, mais surtout d'�conomiser les ressources dans le cas o� un nouveau champ (et inutilis� sur la page) serait rajout�

    Rapidit� d'ex�cution
    - utiliser les simples quotes avec du texte, et toujours concat�ner lorsqu'il y a une variable
    - pour la concat�nation, utiliser les virgules � la place des points (ne fonctionne que avec echo, et pas avec print, ni pour les concat�nations entre variables... et il ne faut pas entourer le texte de parenth�ses)
    - �viter les for... les while avec une indentation a l'int�rieur sont sensiblement plus rapides
    - �viter l'op�rateur ternaire ou les switch... pr�f�rez un "if" qui n'est pas forc�ment plus difficile a comprendre, et qui est sensiblement plus rapide
    - si vous voulez rajouter quelque chose a la suite d'une variables, utilisez la syntaxe "$variable .= 'bonjour';" au lieu de "$variable = $variable . 'bonjour';", et m�me chose pour les indentations : "+=" ou "-="
    - �viter les regex... tr�s lourdes... dans la mesure du possible, utilisez un str_replace au lieu d'un preg_replace, et ainsi de suite !

    Facilit� de relecture
    - INDENTER !!!
    - donner des noms explicites aux variables
    - comme dit plus haut, ne pas utiliser un "SELECT *"
    - mettre des commentaires, et pr�ciser au d�but du fichier sous quelle configuration il a �t� test� (register globals ? short tags ? magic quotes ? version de php ? version de mysql ?)

    Bons r�flexes
    - faire des benchmarks au niveau de la rapidit� d'ex�cution si vous avez un doute
    - si vous avez une t�che longue a faire, demandez vous si cr�er une interface (plus ou moins automatis�e) ne vous faciliterait pas la vie

  13. #173
    Expert confirm�
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste
    Secteur : Sant�

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    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($i=0;$i<sizeof($arr);$i++)
    ca c'est pas bon!!!
    peux-tu pr�ciser un peu, je capte pas l�...
    en fait en th�orie tous les arguments du for son �valu� � chage passage de la boucle.
    si sizeof ($arr) vaut 10 tu vas passer 10 fois dan sla boucle est tu vas 10 fois �valuer $i<sizeof($arr) tu vas donc appeler 10 fois la fonction

    alors que si tu calcule la valeur avant sizeofarr = sizeof($arr) tu ne teste que $i<$sizeofarr 10 fois mais tu n'appelle la fonction qu'une fois.

    je ne sais pas ce qu'il en est du moteur zend de php mais certain compilateur savent optimiser ce genre de chose et n'appelle la fonction qu'une fois.

    de fa�on g�n�rale pas de fonction dans l'argument d'une boucle.

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    while (mafonction()) {
    ....}
    est l'�quivalent (ce qui est ex�cut�) que
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    $continuer = mafonction();
    while ($continuer) {
      ...
      $continuer = mafonction();
    }
    idem pour toutes les formes de boucles.
    la deuxi�me forme montre bien que mafonctio est appel� autant de fosi qu'elle retournera vrai + une.
    on vois bien qu'elle est dans la boucle.
    A+JYT

  14. #174
    Membre chevronn�
    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
    Par d�faut
    Il faudrait testern j'ai d�j� eu des cas en C ou le code mettait quelques secondes de plus car je mettais justement un strlen() dans la condition.

    cependant ne pas oublier que PHP est un langage interpr�te, il y a de tr�s forts chances que le r�sultat soit mis en cache et non recalcul� � chaque fois, en tout cas si j'avais programm� PHP c'est comme ca que j'aurais fait donc les d�veloppeurs ont surement eu cette id�e.
    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.

  15. #175
    Expert confirm�
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 61
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : Urbaniste
    Secteur : Sant�

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par d�faut
    c'est plus compliqu� que mettre en cache il faut s'assurer que dans le corps de la boucle les arguments de la fonction appel� dans le test ne change pas.

    il faut aussi s'assurer qu'il n'y a pas d'effet de bord. la fonction appel� dans la condition utilise peut �tre des param�tres globaux qui pourraient changer de valeur dans le corps.

    bref il faut assurer l'ind�pendence du r�sultat de la fonction dans la contion de l'algo du corp.

    ce genre d'analyse est particuli�rment difficile � faire. et je ne suis pas du tout sur que php sache le faire.

    plus probablement il est possible que le moteur zend pour un certain nombre de fonctions pr�d�finie sache s'assurer de l'ind�pendance et donc mettre en cache.
    si c'est le cas c'est dans des cas tr�s particulier.

    A+JYT

  16. #176
    Membre chevronn�
    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
    Par d�faut
    Oui en fait tu as probablement raison. Les variables PHP sont probablement dans une listes chain�es, et je me disais qu'il sufirait peut �tre simplement de d�finir un flag dans cette structure, qu'on met � TRUE d�s que la variable recoit une modification. Si la variable n'est pas modifi�e dans la boucle le flag reste � FALSE, et le for () par exemple n'a pas besoin de recalculer cette variable. C'est un peu id�aliste mais c'est surement faisable, mais comme tu le dit je doute PHP finalement l'ai fait, il y a beaucoup de param�tres � prendre en compte
    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.

  17. #177
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    60
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 60
    Par d�faut
    Bon topic,

    juste un point � propos de MySQL et PHP : les moteurs de base de donn�e sont fait pour structurer/organiser/formater les donn�es. Donc ils sont optimis�s pour �a, et le font plus vite que PHP.
    Comme cela a d�j� �t� dit, mieux vaut utiliser SQL plut�t que PHP pour ces t�ches, et quelques fonctionnalit�es 'avanc�es' de SQL peuvent �tre fort utiles :

    *les jointures
    *les requ�tes imbriqu�es (� partir de MySQL 4.1, et pour certaines formes 4.0) : remplace plusieurs requ�tes � la suite par 1 seule
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
     
    SELECT champs1, champs2, etc...  FROM table WHERE id =
       (SELECT id FROM autre_table WHERE...) ;
    *les transactions (�a c'est plut�t pour la s�curit�), mais faire un commit apr�s ses requ�tes c'est toujours mieux
    *pour les probl�mes de base de donn�es bloqu�e par un script : les locks (verrous), mettre un lock en lecture/ecriture sur une ligne plut�t que sur la table enti�re

    Pour un script qui utilise intens�ment les bdd, je pense que c'est sur les connexions qu'il faut se concentrer : �a peut gagner beaucoup de temps.

    Le mode de connexion peut aussi jouer un r�le : si la base de donn�e est locale (sur le m�me serveur PHP), on peut se connecter avec un socket plut�t qu'en TCP, je crois que c'est plus rapide.

    Voil�, si quelqu'un veut bien compl�ter/corriger ce que j'ai �crit ...

    --
    Rom_1

  18. #178
    Membre chevronn�
    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
    Par d�faut
    Les bases de donn�es sont effectivement faites pour formater les donn�es, n�anmoins un cache PHP avec un tableau � inclure �vitera de :
    1) Faire une requ�te vers le serveur SQL (ce qui peut �tre important dans certains cas)
    2) Avoir les donn�es directement dans le tableau sans se taper un d�placement de pointeur ligne par ligne avec un truc genre mysql_fetch_array()
    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.

  19. #179
    FFF
    FFF est d�connect�
    Membre �clair� Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par d�faut
    je viens de surfer sur ce thread en �tant s�r de trouver ce que je vais annoncer. Et non !!!! Grande surprise (ah moins que ma fonction de recherche de IE me joue des tours, dans ce cas l� DSL) je n'ai pas trouv� l'une des plus grandes optimisations concernant les bases de donn�es :



    Pr�vu sp�cialement pour des sites web comme developpez.com avec bcp de forums de users de postes donc de bases de donn�es.

    Indispensable en tous les cas !

  20. #180
    Expert confirm�
    Avatar de siddh
    Inscrit en
    Novembre 2005
    Messages
    3 868
    D�tails du profil
    Informations personnelles :
    �ge : 49

    Informations forums :
    Inscription : Novembre 2005
    Messages : 3 868
    Par d�faut
    c'est effectivement un plus mais ca peut avoir des inconvenients, si tu as droit a 20 connections simultan�es et que tu fais du pconnect, tu seras limit� a 20 users sur ton site alors que sans le pconnect, tu pourras en avoir plus car ils interrogeront pas tous la base en meme temps

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