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

Langage PHP Discussion :

Optimiser ma génération de code HTML


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut Optimiser ma génération de code HTML
    Bonjour à tous,

    Je travaille actuellement sur une interface qui permet d'afficher, modifier ou rechercher des résultats dans une base de données.
    J'utilise des styles et templates HTML différents en fonction des type de données affichées.

    Je trouve que mes pages s'affichent lentement et je suis donc en train de chercher à optimiser mes traitements.

    Après avoir fait des tests de performances, je me rends compte que ce qui prend le plus de temps quand je fais un appel à ma page, c'est la génération de l'affichage et non les requêtes en base de données (sachant que je travaille sur des bases importantes).

    J'ai lu à plusieurs endroits que l'utilisation des double quotes pour des chaines statiques faisait perdre un temps précieux, j'ai donc remplacé toutes mes doubles quotes par des simples quotes.

    J'ai obtenu des fonctions de construction de template php de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    print_object($object)
    {
        $output = '<div>';
        if($object->property == 42)
            $output .= '<span>'.$object->otherProperty.'</span>';
        $output .= '<img src="'.$object->imgSrc.'" alt="'.$object->imgAlt.'" />';
        $output .= '</div>';
     
        return $output;
    }
    Et j'affichait dans le contenu dans ma page en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo print_object($object);

    Là, je dirais que j'arrive à la phase des suppositions, où j'ai testé une modification qui ne semble pas engendrer d’accélérations notables de mon code, et qui m'a poussé à venir sur le forum. Parce qu'à base de suppositions je ne vais pas aller loin.

    Déjà, je me suis dis (et peut-être que je me trompe totalement), que les .= sur ma chaîne de caractère, c'était surement lourd au niveau des ré allocations mémoire pour ma chaîne de caractère.

    Ce que j'ai essayé, c'est de faire des echo directement à la place.

    Donc là, je suis un peu perdu, et j'aimerais savoir qu'est ce qui est le plus efficace pour générer du HTML avec injection de données.
    Est ce qu'il faut que je privilégie les gros blocs de texte, que je print directement les résultats ou alors que stocke dans une variable qui sera envoyée plus tard sur la sortie standard ?

    Voilà, j'espère avoir été clair.

    Merci d'avance

  2. #2
    Membre confirmé Avatar de arnaud036
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    201
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2007
    Messages : 201
    Par défaut
    Tes tests tu les fait sur combien de records ? Car c'est sur que si c'est sur plus 1000 records sa risque de prendre du temps a l'affichage. Donc dans ce cas ce que je ferai, je limiterai le nombre de records retourner par la DB et j'implementerai un systeme de pagination.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 159
    Par défaut
    Bonjour,

    J'ai déjà un système de pagination et j'effectuais mes tests sur 25 records à la fois.

    Pour bien montrer la complexité de la chose : je construit un tableau en trois "zones" de calcul complexes.

    En fait, je dispose de la liste de mes champs pour chaque entrée dans ma base composé d'un nom et d'un type.
    Et je dispose de mes 25 records. Pour l'instant j'ai 6 champs différents à afficher par records.

    Donc, j'itère une première fois sur les 6 champs pour créer la ligne de header du tableau, en ajoutant le nom du champ et en formatant selon un certain template en fonction du champ.

    Ensuite, j'itère une deuxième fois sur les champs pour créer la ligne de recherche qui formate la cellule du tableau en fonction du type de donnée du champ.

    Ensuite, j'itère sur mes 25 records et à chaque records correspond une ligne de mon tableau que je construit en itérant sur chaque champ afin de formater les valeurs de mes records selon leur type.

    Ce qui fait (25 + 1 + 1) * 6 = 162 constructions de code html.

  4. #4
    Membre chevronné

    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 205
    Billets dans le blog
    1
    Par défaut
    J'ai lu à plusieurs endroits que l'utilisation des double quotes pour des chaines statiques faisait perdre un temps précieux, j'ai donc remplacé toutes mes doubles quotes par des simples quotes.
    Pour des chaînes statiques (donc sans la moindre variable PHP à interpréter au sein de la chaîne), le temps d’exécution est sensiblement le même en réalité. La différence est réel et visible lorsqu'il y a du PHP à interpréter

    Donc là, je suis un peu perdu, et j'aimerais savoir qu'est ce qui est le plus efficace pour générer du HTML avec injection de données.
    Est ce qu'il faut que je privilégie les gros blocs de texte, que je print directement les résultats ou alors que stocke dans une variable qui sera envoyée plus tard sur la sortie standard ?
    Moins ton script trimbales de données, moins il consommera de mémoire. Ca peut être un gain de temps non négligeable donc

    Tout dépends de la taille de ton code HTML généré ensuite, mais 162 constructions c'est vraiment pas énorme. A voir peut être du côté du formatage des valeurs ?
    Si tu peux, essaies de mettre plus de traces pour voir combien de temps prends chaque opération.
    Regardes notamment du côté de tes boucles - particulièrement si tu as des boucles imbriquées et le temps d'exécution de chaque fonction utilisée dans ces boucles ?

    Enfin, tu peux étudier la possibilité de mettre en place un cache sur tes pages (selon leur besoin de fraîcheur) ?
    si ce post vous a été utile, si votre problème est résolu.
    Pensez-y !
    __________________________________
    Doc officielle PHP | FAQ PHP | Cours PHP

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    quand tu en es à la gestion de la performance sans cache, il y a 2 ou 3 trucs à considérer :
    Evite la concaténation à outrance
    Evite aussi les include pour la génération du HTML
    Utilise des gros blocs de code avec les syntaxes Nowdoc/Heredoc.

    Pour afficher ceci par exemple :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <div>
        <span>VARIABLE</span>
        <img src="VARIABLE" alt="VARIABLE" />
    </div>

    Tu peux concaténer chaque ligne comme tu le fais avec $output.
    Tu peux sortir le code HTML dans un fichier et faire un include() ou tu peux le faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        return 
    <<<HTML
    <div>
        <span>{$object->otherProperty}</span>
        <img src="{$object->imgSrc}" alt="{$object->imgAlt}" />
    </div>
    HTML;
    Le plus c'est que si tu utilises un IDE comme PHPStorm, il reconnait les types de codes en ligne et tu bénéficies de la correction/auto-completion adéquate.

    Sur un fichier, c'est rien mais quand tu t'attaque à une centaine d'équivalent include sur une page, tu vas voir la différence.

    Toujours sans utiliser cache, il te reste aussi la possibilité de minifier le code PHP regarde ici, le résultat est spectaculaire.

Discussions similaires

  1. Génération de code HTML à partir de PSD
    Par frodum dans le forum Général Conception Web
    Réponses: 12
    Dernier message: 17/12/2012, 13h23
  2. [CKEditor] Génération de code HTML très bizarre
    Par Lost In Translation dans le forum Bibliothèques & Frameworks
    Réponses: 5
    Dernier message: 15/12/2008, 17h15
  3. Génération de fichiers Excel à partir de code HTML
    Par grincheux dans le forum ASP.NET
    Réponses: 2
    Dernier message: 01/06/2007, 14h39
  4. Générer du code HTML
    Par patpst dans le forum C++Builder
    Réponses: 4
    Dernier message: 27/11/2002, 10h27
  5. composant builder4 pour afficher du code html
    Par BranRuz dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/09/2002, 11h35

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