Aller au contenu

lorik

Sujets conseillés

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

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

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

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

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

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

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:

<?php
ob_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

Bonjour,

Je t'ai dit que le ob_start() n'était pas nécessaire...

Un code tel que :

<?php
echo "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

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 fin
redirection("Page.php","Message à afficher");

Function trouvée dans un fichier IPB :)

++

Portekoi

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Je t'ai dit que le ob_start() n'était pas nécessaire...

Un code tel que :

<?php
echo "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

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 :lol:

Lien vers le commentaire
Partager sur d’autres sites

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

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

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é par loufoque
Lien vers le commentaire
Partager sur d’autres sites

Chez moi votre code ne fonctionne pas :nono:

<?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

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 :whistling:
Lien vers le commentaire
Partager sur d’autres sites

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

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

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...