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

Bibliothèques et frameworks PHP Discussion :

[Smarty] Double exécution script PHP si trop de "echo"


Sujet :

Bibliothèques et frameworks PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut [Smarty] Double exécution script PHP si trop de "echo"
    Bonjour,

    Petits soucis avec smarty....

    Je me suis aperçu que mon script principal index.php était exécuté 2 fois malgré 1 seul appel de page (log apache le confirmant) et ce, selon que je fasse des echos plus ou moins importants.

    Pour avoir le coeur net concernant cette double exécution, j'ai fais une requête SQL d'insertion sur une table de test sur mon index.php, j'ai réactualisé ma page et j'ai remarqué 2 insertions à chaque fois dans ma table.

    Après un debugging, j'arrive au constat suivant :

    Si je fais un ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    echo (float)microtime(true)-$deb;
    // ou même un
    echo "test tout bête";
    // en somme un echo assez court
    ?>
    ...il n'y a jamais double exécution.

    Mais si je fais un ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    echo (float)microtime(true)-$deb;
    echo "kjlkjkljlzeklfjkzlejfkzlejklfzjeklfzjeklfjkzlejfkzljefjzlekfjkzlejfkzlejfklejkl";
    ?>
    ...il y a toujours double exécution.

    Selon le nombre de echos et leur importance en nombre de caractères affichés, le script est exécuté une ou deux fois.
    De ce que j'ai pu débuggué ce n'est à priori par lié à la compilation smarty ni au cache...

    J'ai cherché à droite et à gauche et j'arrive pas à expliquer ça.

    Help...

  2. #2
    Membre chevronné Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Par défaut
    Bonjour,

    j'comprend pas ; tu n'as rien d'autre sur ta page ?

    que un echo "blabla...blbala" et ca l'éxécute 2 fois ? ca affiche "blabla...blbalablabla...blbala".
    C'est ça ?

    Gillou.

  3. #3
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Ca n'affiche pas les echos les uns à la suite des autres.

    Visuellement :
    Pendant une fraction de secondes on voit le résultat du echo à l'écran sur une page blanche (car le display smarty n'a pas encore été exécuté).
    Puis...une fois que le display smarty a été exécuté, les echos sont intégrés dans l'affichage des tpl mais j'ai pu constaté que ces derniers sont le fruit d'une deuxième exécution du script grace à un calcul du temps de chargement avec microtime().

    Ces calculs affichés sont différents entre les deux temps de chargement càd AVANT et APRES le display.

    En gros, je vois les echos AVANT puis APRES le display() de smarty.

  4. #4
    Membre chevronné Avatar de LeGilou
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    488
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 488
    Par défaut
    As-tu essayé sur le forum SMARTY ?

  5. #5
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Je ne suis pas allé poser ma question sur le forum smarty mais j'y ai cherché mon problème en tout cas.
    Je vais expliquer ça dans des commentaires de code, ce sera plus parlant :
    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
     
    <?php
     
    $deb = microtime(true);
     
    # des initialisations de variables classes etc....session_start() etc...
    # quelques traitements php simples...
     
    echo "ayaaaaaaa hoplaaaaaa youhouuuuuuuuuuuuuuuu";
    echo (float)(microtime(true)-$deb);
     
    /* Ces echos s'affichent pendant une fraction de secondes car il reste des traitements PHP ci dessous à exécuter avant de faire le display de smarty.
    Le résultat du calcul ci-dessus peut être : 0.034563221 par exemple
    */
     
    # Une série de traitement PHP, requêtes SQL etc...
    # Contrôle du cache des différents templates
    # etc...
     
    $smarty->display();
     
    /* Maintenant que le display est exécuté, les echos sont affichés toujours en haut de la page (normal) mais le résultat du calcul est différent
    le résultat du calcul ci-dessus peut être : 0.0221132 par exemple, et ce résultat ne provient pas d'un cache car les echos ne sont pas compilés par smarty.
    Donc il y a une double exécution du script....
    Debug testé aussi avec une requête sql d'insertion (= double insertions)
    */
     
    ?>

  6. #6
    Invité de passage
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 1
    Par défaut J'ai le même phénomène
    et suis pas avec smarty !!

    moi cela se produit lorsque je clique sur une image ou il y a un lien, qui pointe vers une page php. dans cette page ya un include d'une bibliothèque de fonctions perso ( fait à présent environ 130 ko ). en début de <body>, je commence par venir faire un insert Mysql pour garder une trace de mon passage, puis j'affiche des infos à l'écran.

    pour garder la trace, j'apelle une fonction. elle contient un insert sql avec un horodatage à la seconde prés. J'ai fait aussi un un test de contenu des variables : $_SERVER["REMOTE_ADDR"] pour l'adresse IP et $_SERVER["HTTP_USER_AGENT"] pour le type de navigateur.
    et bien j'ai deux fois l'enregistrement dans la table !!! a rien n'y comprendre....


    quelqu'un as t il une explication ?
    suis en php 5.2 et mysql 5.0


    Merci pour vos lumières...

  7. #7
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    As-tu vérifié de ne pas avoir un onclick + un href au même niveau ?
    Les deux s'exécutent dans ce cas précis (ça m'est arrivé) causant donc deux fois l'appel de ton script PHP.

  8. #8
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut comportement navigateur ?
    Bonjour,
    j'ai essayé tout ce qu'il y a dans cette page.... qui synthétise la plupart des posts que j'ai pu trouver sur le sujet....

    Dans mon cas le meme code en local ne déclenche pas de double requete, j'ai désactivé tout le javascript encore double requete j'ai veillé à aucun attribut vide quel qu'il soit (hormis alt et value) mais là encore echec...

    je cherche des pistes sur le fonctionnement des navigateurs, en fait sur mac je dispose de chrome, opéra, firefox et safari, et il n'y a que safari qui ne déclenche pas de double requete ? le pourquoi de cette question pourrait-il m'aider à résoudre mon probleme ? et puis cette donnée me laisse penser que cela ne vient pas non plus de mon serveur ....

    les requetes xhr ne déclenchent pas de doubles requetes, ça aussi c'est une piste, mais je comptais pas coder toutes mes interfaces en ajax....

    mon probleme à moi c'est que cette double requete trompe mon systeme de clé par page qui justement veille à ne pas executer un script deux fois par erreurs (rechargement d'une page contenant un formulaire)....

    j'ai pas l'habitude de poster sur les forums d'habitude j'y trouve ce dont j'ai besoin et j'ai de nombreux favoris qui pointent sur votre site ^^, mais là je sèche...
    merci de votre attention...

  9. #9
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Ce post est un peu....vieux.
    Peux-tu poster ton code et me dire l'action que tu exécutes et le bug constaté ?

  10. #10
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut sample code
    eu ok ... ben la c'est le code d'une administration de bdd

    l'index.php qui appelle tous les controlleurs et renvoie un echo :

    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
     
    <?php
     
      session_start( ) ;
     
      ini_set( 'memory_limit', '64M' ) ; 
     
      define( 'BASEDIR', '/var/www/c...........e.fr' ) ;
      define( 'OFFICE', 'admin' ) ;
     
      define( 'DEBUG' , false ) ; # tout à false en production
      define( 'DEVMODE', true ) ;
      define( 'SWITCHSECURITY', false ) ;
     
      include BASEDIR.'/config/db.inc.php' ; # database
      include BASEDIR.'/config/init.inc.php' ; # class et models
      include BASEDIR.'/config/init.administration.php' ; # constantes et controlleurs
     
      # déclaration des variables globales
      global $route, $titre ;
      # init sécurité par page
      Session::securite( 'admin' ) ;
     
      $route = new Route( ) ; 
      $menu = new Menu( 'adminMenu' ) ;
      $menu->setTpl( 'adminMenu.tpl' ) ;
     
      $tpl = new template( TPL_DIR ) ;
      $tpl->set_filenames( array( 'index' => 'structure.tpl' ) ) ; 
     
      $structureVars = array( ) ;
      $structureVars['TITRE'] = SITENAME.' '.$titre ;
      $structureVars['SCRIPTS'] = Scripts::html( ) ;
      $structureVars['CSS'] = Css::html( ) ;
     
      # pour le menu de l'administration
      $menu->setItemSelected( $route->getParam( 0 ) ) ;
      $structureVars['MENU'] = $menu->html( false, 'adminMenu' ) ;
     
      $structureVars['CONTENT'] = $route->getContent( ) ;
      $tpl->assign_vars( $structureVars ) ;
     
      echo $tpl->parse( 'index' ) ;
     
    ?>
    ce qui peut générer un formulaire qui pose problème tel que


    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
      <head>
        <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
        <!-- balises métas -->
        <title>... / Administration Editer le Page 3</title>
     
        <!-- CSS -->
        <link type="text/css" href="http://admin.c...........e.com/css/admin.css" rel="stylesheet"/>
        <link type="text/css" href="http://admin.c...........e.com/css/admin_page.css" rel="stylesheet"/>
    <link type="text/css" href="http://admin.c...........e.com/css/adminMenu.css" rel="stylesheet"/>
     
     
     
        <!-- SCRIPTS -->
        <script type="text/javascript" src="http://admin.c...........e.com/js/jquery.js"></script>
        <!-- je sais pas me servir de ça pour l'instant
        <script type="text/javascript" src="http://admin.c...........e.com/js/history.jquery.js"></script>
        -->
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_gen.js"></script>
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_my_over_menu.js"></script>
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_my_click_menu.js"></script>
        <!-- pas besoin pour l'instant
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_my_tab_system.js"></script>
        -->
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_arbored_tab.js"></script>
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_selectable.js"></script>
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_highlight_checkboxs.js"></script>
        <script type="text/javascript" src="http://admin.c...........e.com/js/j_highlight_radios.js"></script>
        <script type="text/javascript" src="http://admin.c...........e.com/js/cle_de_securite.js"></script>
     
        <script type="text/javascript" src="http://admin.c...........e.com/js/tiny_mce/jquery.tinymce.js"></script>
    <script type="text/javascript">
    //<!--
    var Cle ; $( function( ){ Cle = new cleDeSecurite( "46d2b15525c8d5d65215aee719ce7231623d4de1" ) ; Cle.addCle( ) ; } ) ;
    //-->
    </script>
    <script type="text/javascript">
    //<!--
    var ABSOLUTE = "http://admin.c...........e.com" ; var HERE = "http://admin.c...........e.com/pages/3/edit" ; 
    //-->
    </script>
    <script type="text/javascript">
    //<!--
     
        $( function( ){
          $("textarea.tinyPage").tinymce({
            script_url : "http://admin.c...........e.com/js/tiny_mce/tiny_mce.js",
            etc....... je raccourcis un peu pour le post
          });
        } ) ;
     
     
     
    //-->
    </script>
    <script type="text/javascript">
    //<!--
    $( function( ){ myOverMenu( "adminMenu" ) ; } ) ;
    //-->
    </script>
     
     
     
        <script type="text/javascript" src="http://admin.c...........e.com/js/control.js"></script>
     
      </head>
     
      <body>
      <!-- bodyadminbodyadminbodyadminbodyadminbodyadminbodyadmin -->
        <div id="tank">
     
    <!-- je vous ai skippé le menu à rallonge pour le post -->
     
     
     
     
          <div id="content">
     
     
    <!-- file:administration/vue/pages/edit.tpl -->
    <div id="pages">
      <h1>
        Edition du page id:3 - Contact
      </h1>
     
     
    <!-- file:administration/vue/pages/form.tpl -->
    <form method="post" action="http://admin.c...........e.com/pages/3/update"><!-- enctype="multipart/form-data"> -->
      <input type="hidden" name="page[id]" value="3" />
      <p>
        Les champs marqués d'une astérisque ( * ) sont obligatoires.
      </p>
     
     
     
      <fieldset>
        <legend>
          Informations Page
        </legend>
     
        <p>
          <label>Titre : </label>
          Contact
          <input type="text" name="page[titre]" value="Contact" />
        </p>
     
     
        <p>
          <label>
            Menu :
          </label>
          <select name="page[menu]" size="1">
            <option value="none">Aucun</option>
            <option value="footermenu" selected="selected">footerMenu</option>
          </select>
        </p>
     
        <p>
          <label>Content : *</label>
          <span class="descShow">
            <textarea name="page[content]" class="tinyPage">&lt;p&gt;Constituendi autem sunt qui sint in amicitia fines et quasi termini diligendi. De quibus tres video sententias ferri, quarum nullam probo, unam, ut eodem modo erga amicum adfecti simus, quo erga nosmet ipsos, alteram, ut nostra in amicos benevolentia illorum erga nos benevolentiae pariter aequaliterque respondeat, tertiam, ut, quanti quisque se ipse facit, tanti fiat ab amicis.&lt;/p&gt;
     
    &lt;p&gt;Oportunum est, ut arbitror, explanare nunc causam, quae ad exitium praecipitem Aginatium inpulit iam inde a priscis maioribus nobilem, ut locuta est pertinacior fama. nec enim super hoc ulla documentorum rata est fides.&lt;/p&gt;</textarea>
          </span>
        </p>
     
     
      </fieldset>
     
      <p class="p_submit_form">
        <input type="submit" value="enregistrer" />
        |
        <a href="http://admin.c...........e.com/pages" title="annuler">
          annuler
        </a>
      </p>
     
    </form>
     
    <!-- /file:administration/vue/pages/form.tpl -->
     
     
     
     
    </div>
    <!-- /file:administration/vue/pages/edit.tpl -->
     
     
     
     
          </div><!-- /content -->
        </div><!-- tank -->
      </body>
    </html>

    mais la double requete est indifférentes des actions appelées, elle part de tous les liens et formulaires non ajax, je la vois apparaitre dans le debuggeur de chrome avant que celui-ci affiche la deuxieme requete,(dans Network) j'ai cherché s'il y avait moyen et comment de bloquer le nav pour accèder au données du debuggeur sur cette requete mais j'ai encore rien trouvé.

  11. #11
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    avant d'aller plus loin, as-tu regardé côté serveur si la double requête était bien présente ?

  12. #12
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    peux-tu aussi préciser où se trouve le double traitement dans ta page ? A partir de quelle action il commence (envoi du formulaire, chargement de la page ...?).

    Si tu envoies le formulaire via ajax, as-tu désactivé le traitement navigateur sur le bouton submit ? http://api.jquery.com/event.preventDefault/

  13. #13
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Aube (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2012
    Messages : 5
    Par défaut oui ca arrive au serveur
    oui :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [17-May-2012 09:40:16] PHP Notice:  Use of undefined constant BASEDIR - assumed 'BASEDIR' in /var/www/c...............e.fr/admin/index.php on line 5
    [17-May-2012 09:40:16] PHP Notice:  Use of undefined constant BASEDIR - assumed 'BASEDIR' in /var/www/c...............e.fr/admin/index.php on line 5
    puis en fait il n'y avait qu'une requete qui arrivait au serveur ça ne générerait pas mon bug :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Exécuter script php en précisant paramètres dans la console
    Par Pouchou_for_ever dans le forum Langage
    Réponses: 5
    Dernier message: 29/10/2010, 18h12
  2. Exécuter script php avec crontab
    Par Sh4dow49 dans le forum Administration système
    Réponses: 1
    Dernier message: 29/07/2008, 15h49
  3. [SHELL] exécuter script php distant
    Par tuxout dans le forum Linux
    Réponses: 1
    Dernier message: 17/01/2008, 17h12
  4. Exécution Script PHP
    Par xace91 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 13
    Dernier message: 19/12/2006, 00h31
  5. Réponses: 7
    Dernier message: 20/10/2005, 20h51

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