在调用Location: header后,我应该调用exit()吗?

90

调用重定向函数header后,我是否应该调用exit函数?

<?php // fileA
$urlFailToGoTo = '/formerror.php';

if (sth)
{
   header(sprintf("Location: %s", $urlFailToGoTo));
   exit(); //should I call exit() here? or return?
}

?>

谢谢你


6个回答

95
你绝对应该这样做。仅仅设置头部并不能终止脚本的执行。

你好,Oliver,exit会终止formerror.php脚本的执行吗?我想问的是,当我在header之后调用'exit'时,哪个脚本受影响,将不再执行?谢谢 - q0987
2
退出命令总是中断当前脚本(在您的情况下为“fileA”)。您要重定向的页面(“/formerror.php”)完全不受影响。重定向告诉您的浏览器发起一个新的HTTP请求到您在“位置”中指定的位置,它基本上与手动单击链接到“formerror.php”相同。 - rgroli
所以退出基本上只针对服务器,这样它就不会再做任何不必要的工作了? - Gust van de Wal

38

像@rgroli解释的那样,您应该这样做。如果您不想麻烦使用括号,您还可以在exit()内部调用header():

你应该像 @rgroli 解释的一样做。如果你不想费事加括号,你也可以在 exit() 中用 header() 来代替

if(sth) exit(header("Location: http://example.com"));

HTTP/1.1中的Location头总是需要绝对路径。在这里看到注释

注意:这并不是一个黑客技巧,因为只有当参数为整数时才会使用exit code,而header()函数则产生void(以code=0退出,正常退出)。 将其视为像exit_header()函数一样,在Location头之后应该是这样的。


1
我想你是指 exit() 中的 header 吧? ;) - yckart
这难道不意味着您将header的输出作为exit的退出代码传递吗?那不是有些不可取吗? - ADTC
@ADTC 在 PHP 中,header() 返回 void,并且仅在参数为整数时使用退出代码。在这种情况下,它只会静默地停止代码生成(意味着退出代码=0,正常退出)。 - Jan Turoň

22

通常情况下,发送 Location: 头后,最好使用 exit; (注意 - 它是一个关键字,因此不需要 ()), 因为浏览器应该重定向到新页面,所以通常不需要继续执行当前脚本。


8

如果您的头部没有任何代码(PHP或HTML),则不需要添加。


你好,aromawebdesign.com,我在formerror.php中有一些代码。这会有问题吗?谢谢 - q0987
如果在调用header之后有任何代码,您应该调用die();或exit(); - Hydrino

5

使用exit是不良编码习惯。

如果你正在开发一个大型项目并想要创建PHP单元测试用例,exit将会给你带来麻烦。

exit终止脚本和测试的运行!没有办法恢复测试并告诉你它是否失败了...

请组织你的代码方式,确保没有输出,并且在使用重定向时自然结束脚本...


7
如果测试软件无法将其正在测试的脚本隔离,我认为这是测试软件的失误。这就像因为shell脚本使用exit命令终止而导致计算机关闭。 - ADTC
1
不管在任何情况下,终止任何东西都是错误的。编程背后有一个栈的原因。一切都始于函数调用,也应该以函数调用结束。 - Benjamin Eckstein
5
我不知道你在说什么 :/ - ADTC
1
@Umingo,exit调用(或者在函数/方法内部也可以使用break)不就是为了这个目的吗?几乎所有知名编程语言都是如此,不仅仅是PHP。 - David Tabernero M.
1
@Davdriver 写一个 PHPUnit 测试,并尝试检查脚本是否以 exit 语句结束,如果失败会让你头疼不已。这篇文章已经四年了,让它发挥作用吧... - Benjamin Eckstein
显示剩余4条评论

-1

REST

一个相关但不完全相同的情况是在实现 REST API 时。在这种情况下,请求体应包含 XML 或 JSON(或其他一些奇特的格式),因此在将有效负载建立为数组或对象并提供所有适当的标头后,将完成处理:

header( 'Content-Type: application/json' );
exit(json_encode($payload));

或者

header( 'Content-Type: application/xml' );
exit(xmlrpc_encode($payload));

两者都会将有效负载作为正文内容返回,并立即停止处理,释放服务器资源。


1
我不明白为什么这里需要退出。PHP不是会“完成处理”吗? - Your Common Sense
@YourCommonSense:不会的。谁知道还有什么其他的代码呢。处理应该停止:因此需要退出。尽早节省宝贵的资源。 - theking2
1
那你还应该添加HTML输出 :) - Your Common Sense
@YourCommonSense:只有json输出,没有HTML输出。这包含在退出函数中。我建议查看文档。没有理由给出负评。 - theking2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接