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
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
Bonjour,
Tu vas devoir jouer sur la bufférisation de sortie ob_start() ob_flush().
Exemples dans la doc.
en ce qui concerne la solution consistant à un équivalent des threads, tu peux faire des processus fils comme en C avec fork()
merci à vous 2
ripat-> je comprends pas à quoi ca sert exactement ob_start et ob_end_flush ?
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 ?
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();
ca serait plutot le système de cache qu'il faudrait que j'utilises enfin je penses :s
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.Envoyé par ePoX
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é.Envoyé par ripat
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
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
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 ?
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 ?
Comme on dit, une question bien posé, contient 50% de la réponse ... enfin un truc dans ce gout la :?mais j'ai du mal m'expliquer dsl :S
bbye
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
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:
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
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 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.
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(); } ?>
Petit exemple avec JS (fonctionne sous IE & Firefox)
Accélérer ton traitement ou répartir la charge du côté du serveur reste cependant LA piste à investiguer en premier.
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(); } ?>
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
Content que ça te fasse plaisirEnvoyé par hiko-seijuro
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 improbableEnvoyé par hiko-seijuro
Pas de quoi, et puis, y a aucun dérangementEnvoyé par hiko-seijuro
Partager