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. #121
    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
    Citation Envoyé par Kioob
    ça, ça m'a toujours posé problème j'ai pris l'habitude d'indenté "à ma sauce", et j'avoue avoir du mal à en démordre...

    ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    function maFonction&#40;&#41; &#123;
         instructions
        &#125;
    C'est à dire un mélange de la (1) et la (3).
    J'avoue que je suis méga retissent à ce genre de présentation, je préfère de loin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function maFonction&#40;&#41;
    &#123;
       instruction
    &#125;
    car elle est très lisible, on voit de suite le code compris dans l'acolade.
    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. #122
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Bonjour, j'aimerais savoir si les commentaires et autres choses trucs inutiles ont une incidence sur la vitesse d'exécution d'une page appelée très souvent.

    Dans mon cas, il s'agit d'un script d'environnement appelé très très souvent gérant mon site (il s'agit d'un jeu en php, le script gérant par exemple l'IA des créatures)

    Un matin je me suis levé, et j'ai liquidé tout commentaire, indentation, etc... Le fichier est passé de 80ko à 50ko

    Le fait est que le fichier peut être appelé plusieurs centaines (milliers de fois ?) par jour, ce qui représente autant de fois 30ko de moins de chargé.

    J'ai fait de même sur les pages principales (les plus vues par les visiteurs).

    Je suis conscient que php comme les autres compilateurs ignorent les commentaires en compilant, mais contrairement aux autres langages, on obtient pas de fichier "compilé", et donc je me suis dit qu'à chaque fois le serveur rechargeait en ram le fichier complet, et donc si un fichier de 100 ko est vu par 10 visiteurs en meme temps, le serveur prendra 1 Mo en gros de ram pour les compiler.

    Je voulais savoir si dans l'idée c'était intéressant, ou si ct inutile (par exemple si les serveurs étaient de base optimisé pour éviter de recompiler 15 fois les mêmes fichiers en ne gardant qu'une occurence du fichier d'origine en ram) ?


    Autre question que je n'ai pas vu ici (j'ai lu les 10 pages :p) :

    Je découpe énormément mes sources (pour mon jeu, j'en suis à 700 pages php) de façon à pouvoir retoucher plus facilement telle ou telle partie. Mais du coup je suis confronté à un soucis : include ou require ? include_once ? require_once ?

    je me retrouve souvent avec 4 ou 5 require en début de fichier (suite au test de session ou autre). Il y a assez peu de page ou un fichier est inclu "forcément", j'ai donc opté pour le require. Mais dans le cas par exemple du fichier de connexion (pratiquement appelé partout), ne vaut il pas mieux appeler include ? Avec 2 ou 3 millions de pages vue par mois, et les 2/3 avec un appel à ce fichier, même si c quelques millisecondes, ça peut finir par être un gain de temps (et le contraire aussi niveau perte mémoire, etc...). Pour les *_once, sont ils vraiment utiles si on compare à un simple "function_exists" d'une fonction présente dans le fichier à inclure ? (par exemple une page peut être appelée à partir d'une ayant déjà déclarée une fonction, et d'une autre ne l'ayant pas fait)


    voila voila... merci

  3. #123
    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
    Hello,

    oui les commentaires et autres "choses trucs inutiles" ont une légère incidence sur le temps de "compilation". Mais ce n'est pas pour ça qu'il faut les supprimer !!! Le plus sage est plutot d'installer un cache d'opcode (Turck MMCache par exemple) qui évitera à PHP de recompiler le script systématiquement.

    Pour les inclusions, require et include sont quasiment identiques depuis "belle lurette" : ce n'est que la gestion des erreurs qui change.
    Quant à include_once() vs include(), la première est légèrement plus lente, puisqu'elle inclus un test supplémentaire ; ce qui ne veut pas dire que tu ferais mieux autrement.

    A mon avis tu ne cherches pas forcément où il faut : regarde déjà du coté de la compression des pages, des caches HTTP, des caches de données et/ou html, etc.
    Google is watching you !

  4. #124
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    quand je parle de retirer tout commentaire, et autres trucs inutiles, je veux dire que j'ai 2 fois la page : la page pour développer, et la page à uploader "nettoyée"

    évidemment, dans un soucis de développement tranquille, je garde tout

    Le probleme des caches, c que mes pages sont identiques au niveau source, mais le résultat est différent pour chaque visiteur (sans compter que pour les pages style forum assez visité, il vaut mieux voir les messages en direct plutôt qu'avec un cache :p)

  5. #125
    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
    Sur mon forum j'ai un cache de données, et un cache HTTP.... ça ne pose aucun problème.... quand c'est bien fait.
    Et le gain est évidement énorme.
    Google is watching you !

  6. #126
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    Tous les commentaires ne sont que mon avis (ou experience) ;-)

    Citation Envoyé par Grey
    Je voulais savoir si dans l'idée c'était intéressant, ou si ct inutile (par exemple si les serveurs étaient de base optimisé pour éviter de recompiler 15 fois les mêmes fichiers en ne gardant qu'une occurence du fichier d'origine en ram) ?
    Globalement tu gagneras de la mémoire RAM, ce qui peut etre utile notamnent pour ton jeu.
    Le must reste le cache même si tu risque d'avoir peu de partie cachable dans ton jeu (sauf si tu utilises un systeme de template).

    Si tu veux vraiement gagner de la mémoire évite de charger des fonction inutile.
    Par exemple si tu crées une classe avec 10 fonction et que 95% du tps tu n'utilises que 2 fonctions, il y a surement qqch à faire pour découpler ta classe et ainsi gagner de la mémoire.

    Citation Envoyé par Grey
    je me retrouve souvent avec 4 ou 5 require en début de fichier (suite au test de session ou autre). Il y a assez peu de page ou un fichier est inclu "forcément", j'ai donc opté pour le require.
    Attention ! Mauvaise habitude.
    Il est préférable d'utiliser des classes test si tu veux vérifier tes fichiers, avec un si gros projet tu gagneras du temps.

    Sinon je prefere require_once() que require car on evite d'inclure plusieurs fois les fichiers (et ça prend de la mémoire)

    Quel est le jeu

  7. #127
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Citation Envoyé par Kioob
    Sur mon forum j'ai un cache de données, et un cache HTTP.... ça ne pose aucun problème.... quand c'est bien fait.
    Et le gain est évidement énorme.
    Salut,

    aurais tu de bons petits liens pour expliquer comment c est petites choses doivent etre mise en place ?

    ca m interesse

  8. #128
    Nouveau membre du Club
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 30
    Points
    30
    Par défaut
    Grey a écrit:

    je me retrouve souvent avec 4 ou 5 require en début de fichier (suite au test de session ou autre). Il y a assez peu de page ou un fichier est inclu "forcément", j'ai donc opté pour le require.


    Attention ! Mauvaise habitude.
    Il est préférable d'utiliser des classes test si tu veux vérifier tes fichiers, avec un si gros projet tu gagneras du temps.

    Sinon je prefere require_once() que require car on evite d'inclure plusieurs fois les fichiers (et ça prend de la mémoire)
    En fait, ça se passe généralement comme ça :

    include "entete"
    et la page elle meme

    l'entete contient l'include de connexion à la base (pour les pages de jeu qui oblige à récupérer les données du perso)

    puis un test sur la validité de la session, sur l'homogénéité des données, et leur contenu (qu'elles soient toute la, etc..)

    si un truc cloche, je redirige vers une page logout
    sinon on continue vers la page, ou il y aura les fameux require (qui ne sont qu'une fois par page, et qui ne sont donc inclu que si le test des données est passées)



    Par contre en lisant les optimisations, je me rend compte que je pourrais optimiser les connexions à la base (un jeu générant beaucoup de connexion, vaut mieux les libérer dès que plus nécessaire, avant de lancer la construction de la page d'après les données récup)


    Question :

    vaut il mieux faire

    ** Connexion
    ** Requete
    traitement
    ** eventuelle requete
    traitement
    ** requete (derniere)
    ** Fin de connexion
    autre traitement

    ou

    ** Connexion
    ** Requete
    ** Fin de connexion
    traitement
    ** Connexion
    ** eventuelle requete
    ** Fin de connexion
    traitement
    ** Connexion
    ** requete (derniere)
    ** Fin de connexion

    ?

    on libère les accès, mais en meme temps, ça risque de multiplier les demandes d'accès

    je vais essayer aussi de revoir les pages ou je peux regrouper toutes les requetes en un paquet pour libérer plus vite la connexion, mais bien souvent elles dépendent d'autres choses...

    enfin bref, sinon comme montou je suis intéressé par le systeme de cache
    (je suis pas fort en admin, je fais gérer le serveur par un tiers)

    autre traitement

  9. #129
    Membre à l'essai
    Inscrit en
    Février 2003
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 13
    Points : 17
    Points
    17
    Par défaut
    Pour les bases de données, il faut (normalement)

    - Connexion Base
    Toutes les requetes
    Fermeture

    - Traitement des données (template ou autres)


    En gros, jamais fermer à la fin

    Sinon pour le cache, regarde PEAR

  10. #130
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    si vous avez deux boucles imbriquées les une dans les autres, dans le style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for &#40;$i = 0; $i < 256; $i++&#41; &#123;
       for &#40;$j = 0; $j < 256; $j++&#41; &#123;
          code
       &#125;
    &#125;
    il est très préférable de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $i, $j = 0;
    while &#40;$i < 256&#41; &#123;
      code
      if &#40;$j < 255&#41; &#123; $j++; &#125;
      else &#123; $j = 0; $i++; &#125;
    &#125;
    Gain de performances garantis
    Ne vivez pas vos rêves, mais faite en sorte que votre vie soit plus belle que ceux-ci !

  11. #131
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Noteirak j'ai bien peur que le code que tu as posté (le second) soit faux pour plusieurs raisons:
    • $i va de 0 à 256 inclus. La boucle for du premier exemple va de 0 à 255 inclus.
    • dans le premier exemple, ($i<256) est évalué 256 fois, ($j<256) est évalué 65536 fois. Dans le second exemple, les deux conditions sont évaluées 65536 fois chacunes, ce qui rend ton code 60% plus lent qu'une simple boucle for. (benchmarké sous PHP5.1-dev)

    À priori, dans l'exemple fourni le plus rapide serait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $i = 0;
    do
    &#123;
    	$j = 0;
    	do
    	&#123;
    		// code
    	&#125;
    	while &#40;++$j !== 256&#41;;
    &#125;
    while &#40;++$i !== 256&#41;;

  12. #132
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2004
    Messages : 21
    Points : 22
    Points
    22
    Par défaut
    je m'excuse, je me suis trompé de code pour le 1er exemple, voici le bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $i = 0;
    $j = 0;
    while &#40;$i < 256&#41; &#123;
    	while &#40;$j < 256&#41; &#123;
    		...
    		$j++;
    	&#125;
    	$j = 0;
    	$i++;
    &#125;
    J'ai fait le benchmark, le second est 10% plus rapide.

    Pour l'histoire du 0 à 256, il doit aller de 0 à 255 inclus, ce que font bien mes deux codes, et pas aller de 0 à 256 (vu que je veux 256 boucles pour chaque).
    Ce que je veux dire, c'est si vous devez imbriquez deux boucles whiles, ou deux boucles for, préférez-leur une seule avec une vérification à la fin
    Ne vivez pas vos rêves, mais faite en sorte que votre vie soit plus belle que ceux-ci !

  13. #133
    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
    Petite question d'optimisation, l'utilisation des références avec & est elle une solution pratique ou bel et bien un gain de temps comme en C par exemple ou il est préférable d'utiliser des pointeurs ?
    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.

  14. #134
    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
    Je ne sais pas si cela a changé dans les nouvelles versions, mais quand il s'agit d'une petite quantité de données les références sont plus lentes. C'est un des phénomènes curieux de PHP...
    Google is watching you !

  15. #135
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 23
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par Noteirak
    Pour l'histoire du 0 à 256, il doit aller de 0 à 255 inclus, ce que font bien mes deux codes
    Non, le second ne le fait pas désolé. Mais c'est vrai que je me suis trompé, ce n'est pas $i qui va de 0 à 256, c'est $j. Tu peux le vérifier par toi-même. Quant à ton 3eme exemple... il ne suit pas ce que tu proposes ("une seule avec vérification à la fin") et il est plus lent que celui que j'ai posté plus haut. Sous PHP5.1-dev, sur 2^24 (65536x65536) itérations vides (c-à-d sans code autre que la boucle): 3.85s pour mon code, 11.73s pour ton 3eme exemple.

    Citation Envoyé par dark_genova
    Petite question d'optimisation, l'utilisation des références avec & est elle une solution pratique ou bel et bien un gain de temps comme en C par exemple ou il est préférable d'utiliser des pointeurs ?
    Comme je le disais ailleurs, n'utilisez pas les références durant le développement dans un soucis de performance. Si ton code est mature (c-à-d stable depuis quelques temps) tu peux benchmarker l'utilisation de références aux points-clé, mais le gain est loin d'être systématique. HTH.

  16. #136
    Inscrit
    Avatar de Caerbannog
    Inscrit en
    Novembre 2004
    Messages
    206
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 206
    Points : 273
    Points
    273
    Par défaut
    Un truc évident, mais auquel on doit faire attention dés le début : ne pas charger un fichier avec file() si on est pas interressé par tout son contenu.

  17. #137
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 52
    Points : 47
    Points
    47
    Par défaut
    Bonjour,

    J'ai besoin d'extraire une grosse quantité de donnée depuis mysql pour les envoyer vers jpgraph.

    Y a t-il plus rapide que le classique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    while&#40;$row=mysql_fetch_array&#40;$result, MYSQL_ASSOC&#41;;&#41;
    &#123;
        $tab_val&#91;&#93; = $row&#91;'michMuch'&#93;
    &#125;
    ?

    Il va falloir que je me plonge dans le code de phpMyAdmin mais je vois que la meme requete sql met enormément plus de temps à être exécuté et renvoyé dans mon script que dans phpmyadmin :-\

  18. #138
    Nouveau membre du Club
    Inscrit en
    Janvier 2005
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 41
    Points : 37
    Points
    37
    Par défaut
    Essaye plutôt mysql_fetch_row. Si tu as bcp d'enregistrements ça peut améliorer la rapidité de ton script.

  19. #139
    Membre du Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 52
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par fragmonster
    Essaye plutôt mysql_fetch_row. Si tu as bcp d'enregistrements ça peut améliorer la rapidité de ton script.
    Merci de ta réponse. En cherchant d'avantage j'ai vu que la perte de temps était surtout à l'étape mysql_query et là je pense qu'il ne me reste plus grand chose à faire ...

  20. #140
    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
    Bonjour,

    J'ai un script PHP que je lance manuellement grosso modo 2 fois par jour. Il fait beaucoup d'accès et de mises à jour à ma base mySql et du coup pendant qu'il tourne, ma base est indisponible.

    Vu que mon script est vraiment séquencé en plusieurs étapes bien distinctes, j'ai essayé de mettre de nombreux sleep(2) entre les étapes mais rien n'y fait, ma base ne redevient disponible qu'à la fin du script.

    C'est assez genant vu que ma base héberge entre autre des forums. Du coup lorsque ce gros script tourne, les forums et les sites qui vont chercher des infos dans la base sont out

    Quelqu'un a t il un début de piste ?

    Merci

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