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

Maw*_*awg 23 php redirect http-headers

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

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

dec*_*eze 27

值为5.

您可以输出比Location标题更多的标题header,其中大部分都不想停止代码执行.如果要停止代码执行,则需要exit显式调用.


Tho*_*ite 8

你应该总是在重定向之后死()或退出()(或者由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!';
Run Code Online (Sandbox Code Playgroud)

如果所有其他答案都是正确的,你会假设$ _SESSION ['some_value']等于'完成!' - 但是我运行了代码而事实并非如此.

这是我的结果:

some_value: 174
time: 0.0026998519897461
Run Code Online (Sandbox Code Playgroud)

试用二:

some_value: 218
time: 0.0033109188079834
Run Code Online (Sandbox Code Playgroud)

试用三:

some_value: 218
time: 0.0035371780395508
Run Code Online (Sandbox Code Playgroud)

试用四:

some_value: 174
time: 0.0026431083679199
Run Code Online (Sandbox Code Playgroud)

试用五:

some_value: 174
time: 0.0027921199798584
Run Code Online (Sandbox Code Playgroud)

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

  • 一个优秀且信息丰富的答案 - 如果有更多这样的答案,我现在已经接受了它,而不是之前接受的答案(我希望发帖者不会介意;这不像他需要这些点;-)。谢谢 (2认同)

Mar*_*c B 5

一旦你发布了 header,你就开始了你的代码和网络服务器/浏览器之间的竞争。通常,浏览器一收到重定向,就会关闭运行脚本的连接并开始连接到新的重定向 URL。当连接关闭时,Web 服务器通常会尝试终止该脚本。

您可能很幸运,能够完成您想做的任何其他事情,或者您可能很不幸,脚本甚至无法在调用后到达下一行header()

不过,有一个ignore_user_abort()函数可以让您的脚本继续运行,无论连接状态如何。