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"]
?
你应该总是在重定向之后死()或退出()(或者由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确实等于"完成!" 因此,如果您打算在重定向之后执行诸如日志记录或数据库查询或发送电子邮件之类的重要操作,请记住这一点.
一旦你发布了 header,你就开始了你的代码和网络服务器/浏览器之间的竞争。通常,浏览器一收到重定向,就会关闭运行脚本的连接并开始连接到新的重定向 URL。当连接关闭时,Web 服务器通常会尝试终止该脚本。
您可能很幸运,能够完成您想做的任何其他事情,或者您可能很不幸,脚本甚至无法在调用后到达下一行header()
。
不过,有一个ignore_user_abort()
函数可以让您的脚本继续运行,无论连接状态如何。