Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP issue with sleep() and redirect

Tags:

php

I have the following dumb code:

<?

echo "<html><br><br><br><div id='loading'><p><img src='loader.gif'> Please wait 6 seconds...</p></div></html>";
sleep(6);
header('Location: http://google.com/');

?>

Why doesn't the HTML piece of code show up in the browser before sleeping 6 seconds and then redirecting? The codes doesn't output the HTML code at all, waits 6 seconds then sends me to the location. What do I do wrong?

like image 767
bsteo Avatar asked Oct 17 '25 19:10

bsteo


2 Answers

This will not work. Because the first echo will start output. After that header call will just fail. However you can do it with refresh header on PHP side.

<?php
header('Refresh: 5;URL=http://www.google.com/'); // refresh header
echo "<html><head>";
// meta refresh
echo "<meta http-equiv=\"refresh\" content=\"5;URL=http://www.google.com/\" />"; 
echo "</head><body><br><br><br><div id='loading'><p><img src='loader.gif'> Please wait 6 seconds...</p></div></body></html>";
?>
<script type="text/javascript">
// javascript refresh
window.setTimeout(function(){
    location.href="http://www.google.com";
},5000);
</script>

On the above script 3 things were handled.

  1. HTTP Refresh header
  2. Meta refresh
  3. Javascript Refresh

Note: Meta refresh is deprecated (though I have shown in example). HTTP Refresh header is recommended.

like image 200
Shiplu Mokaddim Avatar answered Oct 20 '25 10:10

Shiplu Mokaddim


You would need to do something like (this won't work):

<?php

echo "<html><br><br><br><div id='loading'><p><img src='loader.gif'> Please wait 6 seconds...</p></div></html>";
@ob_flush(); //flush the output buffer
flush(); //flush anything else
sleep(6); //wait
header('Location: http://google.com/'); //redirect

?>

However: This won't work as expected, you cannot redirect the browser after sending content (PHP will throw and error and tell you this)

Instead you should:

<?php

echo "<html><meta http-equiv=\"refresh\" content=\"6;URL='http://YOURURL.com/'\"><br><br><br><div id='loading'><p><img src='loader.gif'> Please wait 6 seconds...</p></div></html>";

?>

Where the <meta http-equiv="refresh" content="6;URL='http://YOURURL.com/'"> tag is an HTML tag to tell the browser to change to the provided url after 6 seconds

To avoid adding the meta tag, you could also do this:

<?php
header('Refresh: 6;URL=http://www.YOURURL.com/');
echo "<html><br><br><br><div id='loading'><p><img src='loader.gif'> Please wait 6 seconds...</p></div></html>"
?>

But to be safe you should add both the header and the meta tag!

like image 35
Pez Cuckow Avatar answered Oct 20 '25 09:10

Pez Cuckow



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!