是标头后面的代码(“位置: ...”执行?
2022-08-30 16:06:07
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;
的价值是什么?$_SESSION["some_value"]
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;
的价值是什么?$_SESSION["some_value"]
值为 5。
您可以输出比带有 的标头多得多的标头,其中大多数标头您都不想停止代码执行。如果要停止代码执行,则需要显式调用。Location
header
exit
在重定向之后,你应该总是 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确实等于“完成!”,因此,如果您打算执行一些关键操作,例如日志记录或数据库查询或在重定向后发送电子邮件,请记住这一点。