lorik Posté 29 Juin 2005 Partager Posté 29 Juin 2005 Bonjour, Un petit pb avec sleep : J'ai une page php, qui enregistre des données et qui redirige ensuite automatiquement vers une autre page. Je voudrait afficher un message pendant 3 secondes avant la redirection. J'ai donc fait : Echo "Mon message";Sleep (3);// suite du script... Le problème, c'est que le script temporise AVANT d'afficher le message, et pas APRES. J'ai rien trouvé dans la doc php sur ce phénomène, donc please Help ! Par avance merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
WewEB Posté 29 Juin 2005 Partager Posté 29 Juin 2005 Parfaitement logique, le script PHP est exécuté par le serveur et tout le flux de sortie est ENSUITE redirigé vers le navigateur (rien ne s'affiche tant que la totalité du script n'a pas été exécutée). Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorik Posté 29 Juin 2005 Auteur Partager Posté 29 Juin 2005 Merci Weweb. Moralité, j'lai dans l'os Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 29 Juin 2005 Partager Posté 29 Juin 2005 Je pense que tu devrais mettre un appel à la fonction flush() juste avant le sleep(3). Selon ton code, cela peut marcher. Mais si ton message est dans un tableau, il ne pourra s'afficher qu'une fois tout le tableau défini... donc après la balise </table>. Dan Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 29 Juin 2005 Partager Posté 29 Juin 2005 Pour info, j'utilise le flush suivit d'un sleep() sur les pages outils du Hub, notamment sur la recherche multi-datacentres lorsque les requêtes ne sont pas suffisamment espacées dans le temps. Dan Lien vers le commentaire Partager sur d’autres sites More sharing options...
Xtouch Posté 29 Juin 2005 Partager Posté 29 Juin 2005 Très interessant ça Dan ! Ca voudrait dire que l'on pourait segmenter l'éxécution d'un scriptphp en plusieurs parties. Je n'étais pas au courant de cela, est j'imagine de suite les utilisations possibles ! (serveurs SQL, vous voilà bientôt soulagés !) Néanmoins une petite remarque, ne faut-il pas employé ob_flush() plus flush() pour réellement vider le buffer de sortie ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 29 Juin 2005 Partager Posté 29 Juin 2005 L'utilisation de ob_flush() ne se justifie que si tu utilises les fonctions ob_start() et consorts. L'avantage de flush() est qu'il fonctionne en mode "normal" en forçant l'émission du contenu de la page au moment de l'appel à la fonction. Dan Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorik Posté 30 Juin 2005 Auteur Partager Posté 30 Juin 2005 Merci à tous, je vais tester ça... Lien vers le commentaire Partager sur d’autres sites More sharing options...
destroyedlolo Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 Si ton but n'est que de faire une redirection, le plus simple est de rajouter le header qui va bien. (voir la FAQ web qui se trouve sur mon site pour avoir un exemple) Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorik Posté 1 Juillet 2005 Auteur Partager Posté 1 Juillet 2005 Merci destroyedlolo , Pour la redirection, pas de souci, c'est la temporisation qui me chagrine... Lien vers le commentaire Partager sur d’autres sites More sharing options...
WewEB Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 Après un petit test, il semble que la méthode de Dan ne fonctionne pas, du moins pas comme espéré. J'ai testé le code suivant: <?phpob_start();echo "OK - 1";ob_flush();sleep(60);echo "ok - 2";ob_end_flush();?> Rien n'est renvoyé, et j'obtiens une erreur car la temps maximal d'exécution du script est dépassé (30 secondes sur mon serveur de test). Cecpendant, j'aurais au moins dû avoir le "ok - 1". Aurais-je fait une boulette ? Ou pouvons-nous conclure que PHP ne renvoie RIEN avant la fin de l'exécution du script ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 Bonjour, Je t'ai dit que le ob_start() n'était pas nécessaire... Un code tel que : <?phpecho "OK - 1";flush();sleep(15);echo "ok - 2";flush();?> doit t'afficher les OK-1 et OK-2 à 15 secondes d'intervalle Dan Lien vers le commentaire Partager sur d’autres sites More sharing options...
Portekoi Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 function redirection($chemin,$erreur,$temps=3) { ?> <html><head> <title><?=$erreur?></title> <meta http-equiv="Refresh" content="<?=$temps?>; url=<?=$chemin?>" /> <style type="text/css"> <!-- .redirect {border: 1px solid; margin: 50px; padding: 15px; text-align: center; width: 70%} a { color: #000000; text-decoration: none; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif} a:link { color: #000000; text-decoration: none; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif} a:hover { color: #000000; text-decoration: underline; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif} a:active { color: #000000; text-decoration: none; font-size: 12px; font-family: Verdana, Arial, Helvetica, sans-serif} body { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 12px; font-style: normal; color: #6699cc; text-decoration: none} /* Fin de la section de style généré par WebExpert le 27/07/2003 20:33:31 */ --> </style> </head><body> <div align="center"> <div class="redirect"> <h4><?php echo $erreur;?></h4> <hr size="1" noshade="noshade" /> <b> <a href="<?=$chemin?>">Cliquez-ici si la redirection ne se fait pas automatiquement.</a> </b> </div> </div> </body> </html> <? } //Traitement//A la finredirection("Page.php","Message à afficher"); Function trouvée dans un fichier IPB ++ Portekoi Lien vers le commentaire Partager sur d’autres sites More sharing options...
WewEB Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 Bonjour, Je t'ai dit que le ob_start() n'était pas nécessaire... Un code tel que : <?phpecho "OK - 1";flush();sleep(15);echo "ok - 2";flush();?> doit t'afficher les OK-1 et OK-2 à 15 secondes d'intervalle Dan <{POST_SNAPBACK}> Ca marche, merci de l'astuce, je ne pensais pas cela possible Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 Ca marche, merci de l'astuce, je ne pensais pas cela possible Ben oui, il est inutile de rajouter une couche de buffering alors que c'est justement ce que tu veux éviter Lien vers le commentaire Partager sur d’autres sites More sharing options...
Anonymus Posté 1 Juillet 2005 Partager Posté 1 Juillet 2005 Pour l'histoire du temps dépassé : le temps maximal d'exécution du script est dépassé (30 secondes sur mon serveur de test). Tu as la fonction 'set_time_limit(int second); qui te permet de déterminer le temps max. d'execution du script. Ainsi : set_time_limit(86400); permettra à ton code de s'executer dans un interval de temps maxi de.. 24 heures (suffisant pour la plupart des scripts ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dnegel666 Posté 3 Juillet 2005 Partager Posté 3 Juillet 2005 Slt, je viens de tester flush(); avec l'exemple donné plus haut, et chez moi, ça ne marche pa du tout ! Ca attend les 15 secondes pour m'afficher le tout ! J'ai EasyPHP 1.8 avec PHP 5.0.1 et Apache 1.3.33 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 3 Juillet 2005 Partager Posté 3 Juillet 2005 Slt, je viens de tester flush(); avec l'exemple donné plus haut, et chez moi, ça ne marche pa du tout ! Ca attend les 15 secondes pour m'afficher le tout ! J'ai EasyPHP 1.8 avec PHP 5.0.1 et Apache 1.3.33 Le manuel de flush() dit ceci: Several servers, especially on Win32, will still buffer the output from your script until it terminates before transmitting the results to the browser. C'est à dire que sous windows, plusieurs navigateurs vont tout de même bufferiser la sortie Dan Lien vers le commentaire Partager sur d’autres sites More sharing options...
loufoque Posté 6 Juillet 2005 Partager Posté 6 Juillet 2005 (modifié) je viens de tester flush(); avec l'exemple donné plus haut, et chez moi, ça ne marche pa du tout ! Ca attend les 15 secondes pour m'afficher le tout ! PHP, dans certaines versions ou configurations, active automatiquement une bufférisation. Il faut donc faire _AT_ob_end_clean(); au début du script. Modifié 6 Juillet 2005 par loufoque Lien vers le commentaire Partager sur d’autres sites More sharing options...
tiky Posté 10 Juillet 2005 Partager Posté 10 Juillet 2005 Chez moi votre code ne fonctionne pas <?php_AT_ob_end_clean;echo "OK - 1";flush();sleep(15);echo "ok - 2";flush();?> peut-etre que mon serveur n'est pas bien configuré?? pour info je suis sous linux (ubuntu) avec apache2, php 4.3 et j'utilise firefox Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 10 Juillet 2005 Partager Posté 10 Juillet 2005 PHP, dans certaines versions ou configurations, active automatiquement une bufférisation.Il faut donc faire @ob_end_clean(); au début du script. Je serais curieux de connaître quelles versions ou options de compilation activent le buffering par défaut Lien vers le commentaire Partager sur d’autres sites More sharing options...
loufoque Posté 16 Juillet 2005 Partager Posté 16 Juillet 2005 Ben déjà c'est _AT_ob_end_clean(); pas _AT_ob_end_clean; Ensuite le dernier flush() est inutile. Je serais curieux de connaître quelles versions ou options de compilation activent le buffering par défaut Toutes les versions de PHP que j'ai eu l'occasion d'utiliser le font. Néanmoins les commentaires de certaines personnes laissent à penser que certaines ne le font pas. D'où le @ pour éviter un problème dans ce cas. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Dan Posté 16 Juillet 2005 Partager Posté 16 Juillet 2005 Je serais curieux de connaître quelles versions ou options de compilation activent le buffering par défaut Toutes les versions de PHP que j'ai eu l'occasion d'utiliser le font. Néanmoins les commentaires de certaines personnes laissent à penser que certaines ne le font pas. D'où le @ pour éviter un problème dans ce cas. Je viens de tester cela sur plusieurs serveurs: ob_end_clean() lancé sans avoir lancé le buffering retourne "false". Désolé de te contredire, mais ce n'est pas actif par défaut ! Le manuel de Php dit ceci: Reasons for failure are first that you called the function without an active buffer or that for some reason a buffer could not be deleted (possible for special buffer). Le lancement de ob_end_clean() renvoie false sur tous les hébergements testés, il n'y a donc pas de bufferisation active par défaut. Dan Lien vers le commentaire Partager sur d’autres sites More sharing options...
loufoque Posté 16 Juillet 2005 Partager Posté 16 Juillet 2005 Le script suivant <?phpvar_dump(ob_end_clean());?> affiche bool(true) sur mon serveur perso (winxp). J'ai essayé sur un autre serveur, bool(false). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant