【发布时间】:2011-04-11 05:57:27
【问题描述】:
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;
$_SESSION["some_value"] 的值是多少?
【问题讨论】:
标签: php redirect http-headers
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;
$_SESSION["some_value"] 的值是多少?
【问题讨论】:
标签: php redirect http-headers
你应该总是在重定向之后 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 确实等于“完成!”所以如果你打算做一些重要的事情,比如日志记录或数据库查询,或者在重定向后发送电子邮件,请记住这一点。
【讨论】:
发出标头后,您的代码和网络服务器/浏览器之间就开始了一场竞赛。通常,一旦浏览器收到重定向,它就会关闭运行脚本的连接并开始连接到新的重定向 URL。当连接关闭时,Web 服务器通常会尝试终止脚本。
您可能很幸运,能够完成您想做的任何其他事情,或者您可能很不幸,在header() 调用之后脚本甚至无法到达下一行。
有ignore_user_abort() 函数,它应该让你的脚本继续,不管连接的状态如何。
【讨论】:
exit;,如果您希望它在不执行更多代码的情况下进行重定向。如果它是否执行剩余代码是随机的,那么这将不是一个非常有用的功能,不是吗?
header 命令不会中断您的代码流。即使遇到这种情况,浏览器仍然会下载您的页面,即使它没有显示。考虑 404 页面,这些页面(尽管是错误)仍然由浏览器处理(尽管它们在重定向时被渲染)。
【讨论】:
值为 5。
除了Location 和header 之外,您还可以输出更多的标头,其中大部分您不想停止代码执行。如果要停止代码执行,需要显式调用exit。
【讨论】:
当然 5. 你必须在这样的标题之后添加 exit()。
【讨论】: