exit

(PHP 4、PHP 5、PHP 7、PHP 8)

exit输出消息并终止当前脚本

描述

exit(string $status = ?): void
exit(int $status): void

终止脚本的执行。即使调用了 exit关闭函数对象析构函数 始终会执行。

exit 是一个语言结构,如果未传递 status,则可以不带括号调用。

参数

status

如果 status 是一个字符串,则此函数在退出之前打印 status

如果 status 是一个 int,则该值将用作退出状态,而不是打印。退出状态应在 0 到 254 之间,退出状态 255 由 PHP 保留,不得使用。状态 0 用于成功终止程序。

返回值

不返回值。

示例

示例 #1 exit 示例

<?php

$filename
= '/path/to/data-file';
$file = fopen($filename, 'r')
or exit(
"unable to open file ($filename)");

?>

示例 #2 exit 状态示例

<?php

// 正常退出程序
exit;
exit();
exit(
0);

// 退出并返回错误代码
exit(1);
exit(
0376); // 八进制

?>

示例 #3 关闭函数和析构函数无论如何都会运行

<?php
class Foo
{
public function
__destruct()
{
echo
'Destruct: ' . __METHOD__ . '()' . PHP_EOL;
}
}

function
shutdown()
{
echo
'Shutdown: ' . __FUNCTION__ . '()' . PHP_EOL;
}

$foo = new Foo();
register_shutdown_function('shutdown');

exit();
echo
'This will not be output.';
?>

上面的示例将输出

Shutdown: shutdown()
 Destruct: Foo::__destruct()

注意

注意: 因为这是一个语言结构而不是一个函数,所以它不能使用 可变函数命名参数 调用。

注意:

此语言结构等效于 die().

参见

添加注释

用户贡献的笔记 14 个笔记

36
dexen dot devries at gmail dot com
13 年前
如果你想避免在 FastCGI 中调用 exit(),就像下面的评论所说的那样,但真的,绝对想从嵌套的函数调用或 include 中干净地退出,可以考虑使用 Python 的方法

定义一个名为 `SystemExit` 的异常,抛出它而不是调用 exit(),并在 index.php 中用一个空处理程序捕获它,以干净地完成脚本执行。

<?php

// 文件:index.php
class SystemExit extends Exception {}
try {
/* 代码代码 */
}
catch (
SystemExit $e) { /* 什么也不做 */ }
// 文件结尾:index.php

// 一些深度嵌套的函数或 .php 文件

if (SOME_EXIT_CONDITION)
throw new
SystemExit(); // 代替 exit()

?>
33
albert at removethis dot peschar dot net
15 年前
jbezorg at gmail 提出了以下建议

<?php

if($_SERVER['SCRIPT_FILENAME'] == __FILE__ )
header('Location: /');

?>

在发送 `Location:' 头部后,PHP _将_ 继续解析,头部() 调用下面的所有代码仍将被执行。所以,使用

<?php

if($_SERVER['SCRIPT_FILENAME'] == __FILE__)
{
header('Location: /');
exit;
}

?>
18
theonenkl at gmail dot com
9 年前
关于在 finally 中使用 exit 的一个附注:如果你在 try 块中的某个地方退出,finally 将不会被执行。听起来可能不明显:例如,在 Java 中,你永远不会发出 exit,至少在你的控制器中返回;在 PHP 中,你可能会发现自己从控制器方法中退出(例如,如果你发出重定向)。

下面是 POC

<?php
echo "testing finally wit exit\n";

try {
echo
"In try, exiting\n";

exit;
} catch(
Exception $e) {
echo
"catched\n";
} finally {
echo
"in finally\n";
}

echo
"In the end\n";
?>

这将打印

testing finally wit exit
In try, exiting
11
vincent dot laag at gmail dot com
13 年前
不要在使用 fastcgi(linux/bsd 操作系统)的自动预加载文件中使用 exit() 函数。
它会造成打开的文件至少留下一个“太多打开的文件...”错误的结果。
1
tianyiw at vip dot qq dot com
1 年前
这些是 Linux 或 UNIX 中的标准错误代码。

1 - 通用错误的总括
2 - 误用 shell 内建命令(根据 Bash 文档)
126 - 调用命令无法执行
127 - “命令未找到”
128 - 传递给 exit 的参数无效
128+n - 致命错误信号“n”
130 - 脚本被 Control-C 终止
255\* - 退出状态超出范围
9
void a t informance d o t info
15 年前
致 rich dot lovely at klikzltd dot co dot uk

在 header() 之前使用 "@" 来抑制它的错误,并依赖于 "headers already sent" 错误,在我看来,在构建任何严肃的网站时,这是一个非常糟糕的主意。

这 *不是* 一个干净的防止文件被直接调用的方法。至少这并不是一个安全的方法,因为你依赖于解析器在运行时发出的异常的存在。

我建议使用更常见的方法,例如定义一个常量或分配一个带有任何值的变量,并在包含的脚本中检查其存在,例如

在 index.php 中
<?php
define
('INDEX', true);
?>

在你的包含文件中
<?php
if (!defined('INDEX')) {
die(
'您不能直接调用此脚本!');
}
?>

BR。

Ninj
3
jean dot claveau at gmail dot com
4 年前
如果您启用了 uopz 扩展,请注意它默认情况下会禁用 exit / die()。它们只是被“跳过”。

https://php.net/manual/en/function.uopz-allow-exit.php
5
emils at tvnet dot lv
20 年前
请注意,如果将 PHP 用作 Roxen SAPI 模块,使用 exit() 将明确导致 Roxen Web 服务器死亡。对此没有已知的解决方法,除了不使用 exit()。PHP 的 CGI 版本不受影响。
4
m dot libergolis at gmail dot com
8 年前
除了 "void a t informance d o t info" 之外,这里有一个不需要常量的单行代码

<?php basename($_SERVER['PHP_SELF']) == basename(__FILE__) && die('Thou shall not pass!'); ?>

将其放置在 PHP 文件的开头将阻止对脚本的直接访问。

要重定向到 / 而不是死亡

<?php
if (basename($_SERVER['PHP_SELF']) == basename(__FILE__)) {
if (
ob_get_contents()) ob_clean(); // ob_get_contents() 即使没有活动的输出缓冲也能正常工作
header('Location: /');
die;
}
?>

在单行代码中执行相同的操作

<?php basename($_SERVER['PHP_SELF']) == basename(__FILE__) && (!ob_get_contents() || ob_clean()) && header('Location: /') && die; ?>

关于安全性的说明:即使 $_SERVER['PHP_SELF'] 来自用户,也可以安全地假设其有效性,因为“操作”发生在实际文件执行 *之前*,这意味着该字符串 *必须* 足够有效以执行文件。此外,basename() 是二进制安全的,因此您可以安全地依赖此函数。
1
bill dot gates at hotmail dot com
3 年前
请注意 PHP 的 uopz(User Operations for Zend)扩展。默认情况下,它在启用扩展后立即禁用(阻止)在调用 `exit()` 和 `die()` 时停止 PHP 脚本(FPM 和 CLI)。因此,您的脚本将继续执行。

详细信息:https://php.net/manual/en/uopz.configuration.php#ini.uopz.exit
5
alexyam at live dot com
12 年前
在使用 php-fpm 时,应该使用 fastcgi_finish_request() 而不是 register_shutdown_function() 和 exit()

例如,在 nginx 和 php-fpm 5.3+ 下,这将使浏览器等待 10 秒才能显示输出

<?php
echo "您必须等待 10 秒才能看到此内容。<br>";
register_shutdown_function('shutdown');
exit;
function
shutdown(){
sleep(10);
echo
"因为 exit() 不会立即终止 php-fpm 调用。<br>";
}
?>

这不会

<?php
echo "您可以在浏览器中立即看到此内容。<br>";
fastcgi_finish_request();
sleep(10);
echo
"您无法在浏览器中看到此内容。";
?>
3
devinemke at devinemke dot com
22 年前
如果您使用包含大量包含的模板,那么 exit() 将结束您的脚本,您的模板将无法完成(没有 </table>、</body>、</html> 等)。与其在内容中使用复杂的嵌套条件逻辑,不如创建一个 "footer.php" 文件,在退出脚本之前包含所有 HTML,并将其包含在退出之前。

例如

include ('header.php');
blah blah blah
if (!$mysql_connect) {
echo "无法连接";
include ('footer.php');
exit;
}
blah blah blah
include ('footer.php');
0
chris at ocproducts dot com
6 年前
调用 'exit' 将绕过 auto_append_file 选项。
在一些免费主机上,这可能会导致您被移除,因为他们可能将其用于广告和分析。

因此,如果您在最常见的输出分支上使用它,请谨慎一些。
0
sunfundev at gmail dot com
6 年前
>> 关闭函数和对象析构函数将始终执行,即使调用 exit。

如果您在析构函数中调用 exit,则它是错误的。

正常退出
<?php
class A
{
public function
__destruct()
{
echo
"bye A\n";
}
}

class
B
{
public function
__destruct()
{
echo
"bye B\n";
}
}

$a = new A;
$b = new B;
exit;

// 输出:
// bye B
// bye A
?>

// 在析构函数中退出
<?php
class A
{
public function
__destruct()
{
echo
"bye A\n";
}
}

class
B
{
public function
__destruct()
{
echo
"bye B\n";
exit;
}
}

$a = new A;
$b = new B;

// 输出:
// bye B
?>
To Top