PHP问题:sleep()和重定向

4
我有以下糟糕的代码:
<?

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/');

?>

为什么在等待6秒并重定向之前,HTML代码片段不能在浏览器中显示?代码根本不输出HTML代码,等待6秒钟后将我发送到指定位置。我做错了什么?


你没有做错任何事情,sleep函数就应该像这样工作。 - Nagri
无法工作!echo 的响应已经提交了头信息。 - Vishal
4个回答

7
这样做是行不通的。因为第一个echo将开始输出,之后header调用会失败。但是你可以在PHP端使用refresh header实现。
<?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>

在上述脚本中,处理了三件事情。
  1. HTTP 刷新头
  2. Meta 刷新
  3. Javascript 刷新
注意: Meta 刷新已经不推荐使用(尽管我在示例中展示了)。推荐使用 HTTP 刷新头。

3
您需要做类似以下的事情(这样做是行不通的):
<?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

?>

然而:这样做不会如预期般奏效,你不能在发送内容之后重定向浏览器(PHP会抛出错误并告诉您)。

相反,您应该:

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

?>

在HTML中,<meta http-equiv="refresh" content="6;URL='http://YOURURL.com/'"> 标签用于告诉浏览器在6秒后切换到提供的URL。

如果不想添加meta标签,也可以这样做:

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

但是为了更加安全,你应该同时添加头部和meta标签!


2
如果你这样做,你的头部位置将不起作用,因为头部已经被发送了。 - tomsv
在内容传输之后,您不能发送标头。 - Luca Rainone
我知道,我在我的回答中写了这个,也许你在我大约1分钟前的编辑之前没有重新加载。 - Pez Cuckow
谢谢大家!你们非常有帮助,我的代码现在运行得非常完美。 - bsteo

1

来自PHP文档

请记住,在任何实际输出之前调用header(),无论是通过普通HTML标记、文件中的空行还是通过PHP发送。阅读代码时很容易犯一个常见错误,使用include、require函数或另一个文件访问函数,并在调用header()之前输出空格或空行。如果使用单个的PHP/HTML文件,同样存在此问题。

因此,你不能在echo 后再使用 header() 函数。

我建议您改用javascript或meta标签。


-1

我认为你正在寻找header('Refresh: 6; url=http://google.com/')来进行重定向

不需要缓冲和脚本休眠。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接