标题后面的代码(“位置:...”)是否已执行?

时间:2010-09-12 02:38:21

标签: php redirect http-headers

$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;

$_SESSION["some_value"]的价值是什么?

5 个答案:

答案 0 :(得分:26)

值为5.

您可以使用Location输出比header标题更多的标题,其中大多数标题都不希望停止代码执行。如果要停止代码执行,则需要明确调用exit

答案 1 :(得分:7)

你应该总是在重定向之后死掉()或退出()(或者由Mark B指出,使用ignore_user_abort()),因为你无法确切知道会发生什么。

虽然某些代码会在标题位置重定向后执行,但重要的是要注意并非所有代码都必须执行。

根据您的示例,是的,some_value将等于5.但在某些时候脚本将过早终止。

采用以下示例:

session_start();
$_SESSION["some_value"] = 'original value';
header("Location: /index.php/test2");

$start_time = microtime(true);

for($i = 0; $i <= 100000; $i ++)
{
    password_hash($i);  // slow it down
    $_SESSION["some_value"] = $i;   
    $_SESSION['time'] = microtime(true) - $start_time;
}

$_SESSION['some_value'] = 'finished!';

如果所有其他答案都是正确的,那么您可以假设$ _SESSION [&#39; some_value&#39;]等于完成!&#39; - 但是我运行了代码而事实并非如此。

以下是我的结果:

some_value: 174
time: 0.0026998519897461

试验二:

some_value: 218
time: 0.0033109188079834

试验三:

some_value: 218
time: 0.0035371780395508

试用四:

some_value: 174
time: 0.0026431083679199

试验五:

some_value: 174
time: 0.0027921199798584

如果我实现ignore_user_abort(TRUE);在上面的脚本中,some_value等于&#34;完成!&#34;因此,如果您打算在重定向之后执行诸如日志记录或数据库查询或发送电子邮件等重要操作,请记住这一点。

答案 2 :(得分:3)

发布标题后,您就开始在代码和网络服务器/浏览器之间进行竞争。通常,只要浏览器收到重定向,它就会关闭运行脚本的连接并开始连接到新的重定向URL。当连接关闭时,Web服务器通常会尝试终止该脚本。

你可能会很幸运,能够完成你想做的任何事情,或者你可能不走运,而且header()电话后脚本甚至无法到达下一行。

ignore_user_abort()函数,不管连接的状态如何,都应该让你的脚本继续运行。

答案 3 :(得分:2)

header命令不会中断代码流。即使遇到这种情况,浏览器仍然会下载您的页面,即使它没有显示。考虑404页面(尽管是错误的)仍然由浏览器处理(尽管它们在重定向时不会被渲染)。

答案 4 :(得分:1)

当然5.你必须在这样的标题之后添加exit()。