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 :

[PHP-JS] Équivalent thread en PHP


Sujet :

Langage PHP

  1. #1
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut [PHP-JS] Équivalent thread en PHP
    Bonjour,

    voila j'ai un script qui génère des miniatures mais ca prends du temps. Comment je pourrais faire que la pages s'affiche petit à petit pendant que le script continue sa génération ?

    merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Bonjour,

    Tu vas devoir jouer sur la bufférisation de sortie ob_start() ob_flush().

    Exemples dans la doc.

  3. #3
    Invité
    Invité(e)
    Par défaut
    en ce qui concerne la solution consistant à un équivalent des threads, tu peux faire des processus fils comme en C avec fork()

  4. #4
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    merci à vous 2

    ripat-> je comprends pas à quoi ca sert exactement ob_start et ob_end_flush ?

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Tu peux regarder les ticks aussi :
    http://fr.php.net/manual/fr/control-...es.declare.php

    Par contre, j'imagine (c'est un peu flou) que le probleme se pose lorsque tu généres ta page.
    Et que durant cette génération les balises img le ralentisse car elles attendent que le serveur répondent ?
    Auquel cas tu est tributaire du navigateur. dans ce cas la pourquoi ne pas créer un cache ?

  6. #6
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    parce que je savais pas qu'on pouvait :p

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Au lieu d'être envoyé au client, les sorties sont mises en tampon. Les tampons sont vidés avec un flush. Petit 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $texte = "\nBonjour, timestamp --> ";
     
    echo '<pre>';
     
    ob_start();
      echo $texte.date('H:i:s');
    ob_end_flush();
    flush();
    sleep(3);
     
    ob_start();
      echo $texte.date('H:i:s');
    ob_end_flush();
    flush();
    sleep(3);
     
    ob_start();
      echo $texte.date('H:i:s');
    ob_end_flush();
    flush();
    sleep(3);
     
    ob_start();
      echo $texte.date('H:i:s');
    ob_end_flush();
    flush();

  8. #8
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    ca serait plutot le système de cache qu'il faudrait que j'utilises enfin je penses :s

  9. #9
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Dans ce cas précis je comprend pas trop bien l'utilité du ob_*.
    Puisque ton problème ce sont les temps de génération du serveur qui ne seront pas fondamentalement réduit en utilisant ob_*.

    Par contre rien ne t'empeche d'enregistrer les miniature dans un dossier et de les récréer lorsque la date de modification de l'image d'origine est supérieur à la date de création de la miniature.
    Et si ce n'est pas le cas faire une simple lecture de fichier.

    non?

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par ePoX
    Dans ce cas précis je comprend pas trop bien l'utilité du ob_*.
    Puisque ton problème ce sont les temps de génération du serveur qui ne seront pas fondamentalement réduit en utilisant ob_*.

    Par contre rien ne t'empeche d'enregistrer les miniature dans un dossier et de les récréer lorsque la date de modification de l'image d'origine est supérieur à la date de création de la miniature.
    Et si ce n'est pas le cas faire une simple lecture de fichier.

    non?
    Exact. Une gestion de cache sera toujours plus efficace que de générer à chaque fois les images. La bufférisation de sortie sera l'ultime solution si les images changent à chaque fois (aucune image fixe) mais elle ne réduira effectivement pas le temps de traitement. Il n'y a pas de miracle.

  11. #11
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par ripat
    Exact. Une gestion de cache sera toujours plus efficace que de générer à chaque fois les images. La bufférisation de sortie sera l'ultime solution si les images changent à chaque fois (aucune image fixe) mais elle ne réduira effectivement pas le temps de traitement. Il n'y a pas de miracle.
    Non le temps de traitement ne sera pas amélioré mais si on se réfère au post initial qui est "comment afficher la page petit à petit", des flush() réguliers éventuellement associés à du javascript permettent de modifier le contenu de la page sans que le traitement serveur ne soit terminé.

  12. #12
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    en fait le script ne génère les miniatures qu'une seule fois (le premier affichage de la page) :s

    comment ça des flushs réguliers associé à du javascript

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Si c'est la une demande d'aide parce que ton script ne fonctionne pas, file nous un peu de code :)
    Les boules de crystal sont en grève :s

  14. #14
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    nan lol le script fonctionne parfaitement, la seule chose qui me gène est le fait que le temps de chargement de la page fait plus de 30 secondes ce qui fait donc planté l'affichage c'est pour cela que je demandais comment faire un thread : pour que la page s'affiche et que la génération s'exécute en arrière plan

    mais j'ai du mal m'expliquer dsl :S

    faut toujours le code ?

  15. #15
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Même avec un système de cache ?
    Tu l'as implémenté ?
    Parce que si la description que j'ai fais plus haut correspond bien à ton problème je ne vois pas vraiment d'autres solutions adéquat pour accélerer nettement le temps de génération globale de la page et donc le temps d'affichage.

    Par curiosité tu affiches combien d'image sur ta page ?
    De quel poids ?
    Avec une lecture en local (vis-à-vis du serveur), et pas sur un réseau ?

    mais j'ai du mal m'expliquer dsl :S
    Comme on dit, une question bien posé, contient 50% de la réponse ... enfin un truc dans ce gout la :?

    bbye

  16. #16
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    je dirais une dizaine d'images, voir un peu plus, et en local.

    Pour le poids je ne sais pas. Je n'ai pas implémenté le système de cache je suis en train de regarder les docs

  17. #17
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Bon, essayons de répondre méthodiquement:


    Tu as une page longue à charger, c'est pour ça que tu demandes si les threads existent et peuvent te venir en aide

    Alors, non, pour l'instant les threads n'existent pas. Il y a bien des projets par ci, par là mais sans plus.

    Est-ce que s'ils existaient, ces threads te seraient utiles?

    Pas sûr du tout car ils n'accélèreront en rien le temps nécessaire à générer tes miniatures. Concernant l'affichage, il faudra voir comment ces threads auront été implémentés et si tu pourras rendre la main avant que ces threads soient terminés car dans le cas contraire, ils ne t'aideront pas.

    Tu dis que l'affichage plante, veux-tu dire que tu reçois une erreur de type "Temps d'exécution maximum dépassé....", si tel est le cas, tu devrais pouvoir t'en sortir :

    - Soit en changeant max_execution_time dans php.ini et en redémarrant apache
    - soit en mettant un ini_set('max_execution_time',0); (temps illimité) en début de script

    En ce qui concerne les flush(), selon le type de serveur et de client (donc bcp d'incertitudes) ça peut éventuellement te permettre de déjà envoyer de l'output au navigateur avant que le traitement php ne soit terminé. Il est parfois nécessaire de faire plusieurs flush() successifs pour que cela fonctionne. C'est un peu de la bidouille mais bon...Petit 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    <html>
    <body>
    <table>
    <?php
    for($i=0;$i<6;$i++)
    {
     
      echo '<tr><td><img src="MyImage.gif"></td></tr>';
      MyFlush();
      sleep(2);//temporisation pour mettre en exergue le fait que les données sont envoyées au nav. avant la fin du script
    }
    ?>
    </table>
    </body>
    </html>
    <?php
    function MyFlush()
    {
      while(ob_get_length()!==false)
      {
        ob_end_flush();
      }
      flush();
      ob_start();
    }
    ?>
    Ceci par exemple t'ajoute une image dans une table toutes les deux secondes et AVANT la fin du script. Cependant, ceci fonctionne avec firefox comme client, pas avec IE6. Probablement car IE attend de recevoir le "</table>" (d'où l'intérêt d'utiliser javascript, mon 3ème exemple) car par exemple, ceci fonctionne à la fois sur IE et firefox

    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
     
    <html>
    <body>
    <?php
    for($i=0;$i<6;$i++)
    {
     
      echo $i;
      MyFlush();
      sleep(2);//temporisation pour mettre en exergue le fait que les données sont envoyées au nav. avant la fin du script
    }
    ?>         
    </html>
    <?php
    function MyFlush()
    {
      while(ob_get_length()!==false)
      {
        ob_end_flush();
      }
      flush();
      ob_start();
    }
    ?>
    Ceci montre bien qu'il est possible de manipuler la manière dont le serveur va communiquer avec le client mais que l'on marche un peu sur des oeufs. Le mieux dans le cas de manipulation "approfondie" du DOM est d'utiliser le javascript.

    Petit exemple avec JS (fonctionne sous IE & Firefox)

    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
    <html>
    <head>
    <script language="javascript">
    /*
    AddTable crée la table dans le DOM.
    */
    function AddTable()
    {
      MyTable=document.createElement('table');
      MyTable.appendChild(document.createElement('THEAD'));
      MyTable.appendChild(document.createElement('TBODY'));
      document.body.appendChild(MyTable);
    }
    /*
    AddRow ajoute une ligne (<tr>) dans la table
    */
     
    function AddRow(value)
    {
     
        var NewLine=document.createElement('TR');
        var NewCell=document.createElement('TD');
        NewCell.appendChild(document.createTextNode('test'));
        NewLine.appendChild(NewCell);
        MyTable.childNodes[0].appendChild(NewLine);
    }
    </script>
    </head>
    <body>
     
    <?php
    JsCall('AddTable'); //Création de la table.
    for($i=0;$i<2;$i++)
    {
      JsCall('AddRow',$i); //Ajout d'une ligne
      MyFlush();
      sleep(2);//temporisation pour mettre en exergue le fait que les données sont envoyées au nav. avant la fin du script
    }
    ?>
     
    </body>
    </html>
     
    <?php
    function JsCall($func,$p=null)
    {
      echo '<script language="javascript">';
      if(!empty($p))
      {
       echo $func.'('.$p.')';
      }
      else
      {
       echo $func.'()';
      }
      echo '</script>';
    }
     
    function MyFlush()
    {
      while(ob_get_length()!==false)
      {
        ob_end_flush();
      }
      flush();
      ob_start();
    }
    ?>
    Accélérer ton traitement ou répartir la charge du côté du serveur reste cependant LA piste à investiguer en premier.

  18. #18
    Membre expert
    Avatar de hiko-seijuro
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 011
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 011
    Points : 3 065
    Points
    3 065
    Par défaut
    ah bah c'est parfait merci bcp !!!

    Pour les threads je pensais effectués 2 traitement en parallèle l'affichag de de la page qui prendrais X secondes et la génération qui prenait plus de temps

    merci pour tout et désolé du dérangement

  19. #19
    Membre expert

    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    1 581
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 581
    Points : 3 016
    Points
    3 016
    Par défaut
    Citation Envoyé par hiko-seijuro
    ah bah c'est parfait merci bcp !!!
    Content que ça te fasse plaisir

    Citation Envoyé par hiko-seijuro
    Pour les threads je pensais effectués 2 traitement en parallèle l'affichag de de la page qui prendrais X secondes et la génération qui prenait plus de temps
    Effectivement mais ça reste à l'heure actuelle du pur "fantasme phpien" puisque les threads n'existent pas et qu'on ne sait pas comment ils seraient implémentés dans un futur improbable
    Citation Envoyé par hiko-seijuro
    merci pour tout et désolé du dérangement
    Pas de quoi, et puis, y a aucun dérangement

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

Discussions similaires

  1. [PHP-JS] équivalent charAt en php
    Par djazz dans le forum Langage
    Réponses: 5
    Dernier message: 31/07/2007, 19h07
  2. [PHP-CLI] équivalent à setInterval
    Par SamuelDr dans le forum Langage
    Réponses: 8
    Dernier message: 01/07/2006, 20h49
  3. Réponses: 5
    Dernier message: 14/06/2006, 17h35
  4. threads en php
    Par naourass dans le forum Langage
    Réponses: 8
    Dernier message: 21/11/2005, 12h09
  5. [Débutant] équivalent du include() php
    Par R3iTt0R dans le forum ASP
    Réponses: 5
    Dernier message: 07/07/2004, 12h46

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