首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否执行标题(“Location:...”)之后的代码?

是否执行标题(“Location:...”)之后的代码?
EN

Stack Overflow用户
提问于 2010-09-12 10:38:21
回答 5查看 8K关注 0票数 27
代码语言:javascript
复制
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-03-01 00:40:50

你应该总是在重定向之后死掉()或者退出()(或者正如Mark B所指出的,使用ignore_user_abort() ),因为你不能确定会发生什么。

虽然一些代码会在头位置重定向后执行,但重要的是要注意,并不是所有在它之后的代码都会执行。

根据您的示例,是的,some_value将等于5。但是在某些情况下,脚本将被提前终止。

下面是一个例子:

代码语言:javascript
复制
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‘the _value’等于‘完成!’--但是我运行了代码,结果并非如此。

以下是我的结果:

代码语言:javascript
复制
some_value: 174
time: 0.0026998519897461

试验二:

代码语言:javascript
复制
some_value: 218
time: 0.0033109188079834

试验三:

代码语言:javascript
复制
some_value: 218
time: 0.0035371780395508

试验四:

代码语言:javascript
复制
some_value: 174
time: 0.0026431083679199

试验五:

代码语言:javascript
复制
some_value: 174
time: 0.0027921199798584

如果我实现了ignore_user_abort(TRUE);在上面的脚本中,some_value就等于“完成!”所以,如果你打算做一些关键的事情,比如记录日志或数据库查询,或者在重定向后发送电子邮件,请记住这一点。

票数 10
EN

Stack Overflow用户

发布于 2010-09-12 10:41:51

该值为5。

您可以使用header输出比Location标头多得多的标头,其中大多数您不希望停止代码执行。如果您想停止代码执行,则需要显式调用exit

票数 27
EN

Stack Overflow用户

发布于 2010-09-12 11:28:14

一旦你发出了头文件,你就开始了代码和and服务器/浏览器之间的竞争。通常,一旦浏览器接收到重定向,它就会关闭运行脚本的连接,并开始连接到新的重定向URL。当连接关闭时,web服务器通常会尝试终止脚本。

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3693537

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档