退出、exit()、exit(0)、die()、die(0) - 如何退出脚本

87
我认为所有这些(甚至是die()die(0))都是相同的。如果它们不同,哪一个更适合成功退出脚本?如果它们是相同的,是否有任何首选标准来指示脚本成功完成?我倾向于使用exit;
编辑:所有答案都是“die()exit()是相同的”,即使我在我的问题中说过了。我更新了标题,希望能更清楚地表明这不是我的问题。我想清楚地指示命令行脚本的成功。

4
我相信它们是相同的。 https://dev59.com/knI-5IYBdhLWcg3wj5FG - Doug Owings
不要使用任何其他方式,只需使用echo和return的组合即可。 - user656925
2
@HiroProtagonist 完全不同意;return有不同的含义。 - Explosion Pills
7个回答

72

这些函数是完全相同的。我非常确定die()只是对exit()的直接别名,但即使不是这样,它们的功能仍然是一样的。

当这些函数被传入一个字符串参数时,在终止进程之前会将该字符串打印出来。当遇到小于255的整数时,该整数被视为进程的返回代码,并传递回调用PHP脚本的进程。在编写命令行应用程序时特别有用(PHP并不仅限于Web!)。

exitexit()exit(0)之间的区别而言,实际上没有区别。前两者之间肯定没有区别,因为exit在技术上是语言结构,而不是函数,因此可以带括号或不带括号调用,就像echo一样。返回代码0表示“此程序成功运行/无错误”,虽然我不知道如果您不传递参数会发生什么事情,但PHP.net说没有参数的exit表示成功,所以我敢打赌它会返回0,尽管PHP.net没有显示参数的默认值。


3
exit(0) 表示成功退出,exit(1) 表示失败退出。 - Yousha Aleayoub
FYI,从未明确说明(包括PHP手册)在使用字符串参数调用exit(或die)时实际的退出代码是什么。例如,看到常见的die(-1)习惯用法以及大量的die("Poo!...")调用后,人们可能并不那么确定,而且:猜测应该属于其他职业......所以,为了记录:它是0。这也意味着后者die("error!")在CLI脚本中很可能是一个错误!:-o - Sz.

6

正如多个人提到的那样,die() 和 exit() 是完全相同的。

如果您查看 PHP 文档,有两个参数选项:

  • 一个数字值。仅在使用 PHP 命令行而不是 Web 服务器时才有用。零表示成功。非零表示发生故障条件。

  • 一个字符串值。这将在退出时显示给浏览器。

我建议使用异常和自定义 顶级异常处理程序 来管理失败条件,而不是使用 die() 或 exit()。

这样您就可以更灵活地做一些事情,比如自动错误日志记录。此外,如果您正在使用 PHP 实现 JSON API,则此异常处理程序可以返回有效的、指示错误的 JSON 片段。


我了解失败条件,但我想正确地指示成功。 - Explosion Pills
对于普通的基于浏览器的交互,只需使用die()。对于php命令行使用,请使用die(0)。 - nsanders
值得一提的是,die()本身并不表示错误条件。它只是停止所有PHP脚本执行。 - nsanders
提到命令行,许多人忘记了命令行 PHP。+1 - John Magnolia
@JohnMagnolia:但是他随后又忘记了同样的事情,当他说“退出时将显示在浏览器中”时。;)(当然,在CLI控制台中也会显示。) - Sz.

4
我认为在更好的语义方面,即使你已经捕获了异常,die($arg)应该用于异常或意外终止。而exit($arg)应该用于进程的正常(预期/受控)结束,例如在forwhileswitch结构中使用break;来表示一个有限的结束。
然而,我个人经常使用通用的if { } else { }结构来控制巨大进程的不同分支或输出缓冲,以避免使用"exit"。
我还在简单的错误捕获语义中使用die($arg),如: $db = mysql_connect([$args]) or die ($error);...

请参阅https://dev59.com/W2Up5IYBdhLWcg3wXGy8#15320411 - Your Common Sense

1

die();仅仅是exit();的同义词,并且在功能上完全相同。

标准方法是使用退出代码零来表示成功,而使用其他任何代码表示错误情况。


1
在某些情况下,在CLI中进行黑客攻击时,我们不希望程序被终止,但也不想继续完整执行。
这里的目标是避免对一个单独的手动指定文件进行API调用。比如我在界面上有一个漂亮的播放按钮,它执行系统调用。
示例1:任务完成后,程序被终止,没有返回数据。这是不希望发生的。
if ($_GET["play"] != ""){
  // Some job
  exit; 
}
/* Huge amount of data*/ 

示例2:该程序仍在运行,将整个数据作为GET请求发送。这在此情况下是不必要的。这会使浏览器变慢,因为它已经拥有了所有的数据。
if ($_GET["play"] != ""){
  // Some job
}
/* Huge amount of data*/ 

例子3:程序仍在运行,没有按预期返回数据,播放命令已经执行,但整个数据集被解析了,这是不必要的工作,可能会减慢PHP/机器的速度。
/* Huge amount of data*/ 
if ($_GET["play"] != ""){
  // Some job
}

例子4:程序仍在运行,没有按预期返回任何数据,播放命令已经执行,整个数据尚未解析,PHP迅速返回200OK的空响应,正如预期的那样。大家都很开心!
if ($_GET["play"] != ""){
  // Some job
  goto END;
}
/* Huge amount of data*/
END: // this a marker, so it ends with colon, not semicolon

是的!有时候使用GOTO被认为是最好的选择!

https://www.php.net/manual/en/control-structures.goto.php

https://istack.dev59.com/kQnqC.webp


0

die()通常用于以错误输出的方式终止脚本:

die("There was a fatal error");

相比之下,exit通常用作成功退出(至少在我的编码中是这样)

PHP手册说这两个函数是相同的。


0

dieexit完全等效。

来自手册:

如果状态是一个整数,那么该值将被用作退出状态。

只有在您有某种基于退出状态执行操作的包装器时,这才有用。除非您有特定的需要向外界报告退出代码,否则只需使用exit;


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