是标头后面的代码(“位置: ...”执行?

2022-08-30 16:06:07
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;

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


答案 1

值为 5。

您可以输出比带有 的标头多得多的标头,其中大多数标头您都不想停止代码执行。如果要停止代码执行,则需要显式调用。Locationheaderexit


答案 2

在重定向之后,你应该总是 die() 或 exit()(或者正如 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['some_value']等于“完成!”——但我运行了代码,但事实并非如此。

这是我的结果:

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确实等于“完成!”,因此,如果您打算执行一些关键操作,例如日志记录或数据库查询或在重定向后发送电子邮件,请记住这一点。


推荐