PHP:利用 exit();或者死();标题后(“位置:”);

问题描述 投票:0回答:6

我有一个用户登录/注册系统,只需使用

// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));

我最近读了一篇关于

exit();
die();
的文章,但不知道我应该使用这些。据我了解,他们让PHP结束了?那是对的吗?我可以实现这一目标的最佳方法是什么,只需在 header(); 之后直接添加这些函数之一即可。我有执行力吗?

我有 AJAX、jQuery 读取我的 login.php/register.php,这会受到任何影响吗?

编辑:除了 header(); 之后,我还应该在哪里使用

exit();
die();
函数?
exit();
更多用于 PHP,而
die();
更多用于 Perl?

php exit die
6个回答
39
投票

我也一直在寻找这个问题的答案。我发现了什么:

为什么要 die() 或 exit():

如果您不在

header('Location: http://something')
之后放置 die() 或 exit(),您的脚本可能会继续导致意外行为。例如,这可能会导致您实际上想要通过重定向 (HTTP 301) 阻止的内容被泄露。上述内容对于最终用户来说可能无法直接看到,因为浏览器可能不会呈现它(由于 301)。结论,exit() 和 die() 函数阻止脚本继续运行。

差异:

我也想知道这些功能之间的区别,因为它似乎没有。然而,在 PHP 中,标头输出存在明显差异。 在下面的示例中,我选择使用不同的标头,但为了显示 exit() 和 die() 之间的差异,这并不重要。

Exit() 运行中

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

结果:

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

Die() 运行中

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

结果:

HTTP/1.1 304 Not Modified 
Connection: close

差异

因此,die() 会关闭连接,而exit() 则不会。无论您想要保持连接打开还是关闭连接,这取决于性能。两者都有优点和缺点,具体取决于您的具体要求。

Wiki 上的 HTTP 持久连接


11
投票

http://php.net/manual/en/function.exit.php

http://php.net/manual/en/function.die.php

该函数用于中断脚本执行。您需要使用

exit
die
header("Location: " . getenv("HTTP_REFERER"));
之后停止执行脚本,因为在其他情况下,您的脚本将执行到最后,这可能会导致一些意外的行为。


4
投票

答案已被接受,但似乎每个人都忽略了问题中明显的WTF:

header("Location: " . getenv("HTTP_REFERER"));
  1. 返回引用者对于用户代理来说是可选的

  2. 很容易被伪造

  3. 没有办法告诉用户登录失败

  4. 没有身份验证失败的 HTTP 语义通信

  5. 虽然环境变量 HTTP_REFERER 应与请求标头变量相同,但 RFC 3875 中未指定它,因此即使在请求中呈现给 Web 服务器,getenv("HTTP_REFERER") 也可能返回不同的值


2
投票

好吧,距离上次给出答案已经过去很长时间了。无论如何:D不知怎的,我偶然发现了一个类似的问题,看看我的解决方案是什么:

die( Header( "Location: mytarget.php?arg1=foobar" ) );

一石二鸟 - 似乎对我有用。


0
投票
for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        exit("\n Using exit(), We are done");
    }
}

现在让我们看一下使用 die() 的同一示例;

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        die("\n Using die(), We are done");
    }
}

其中每一个的输出分别为:“使用 exit(),我们完成了 使用 die(),我们完成了”。现在让我们尝试每一个来输出一个数字。

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        exit(-1);
    }
}

使用 die() 查看同一示例的输出;

for($i = 0; $i < 10; $i++)
{
    if ($i == 2)
    {
        die(-1);
    }
}

这些示例是使用文本板编辑器编辑的。上述两种情况的输出均为“工具已完成,退出代码为 -1”。

因此,对于“php 中 die() 和 exit() 之间有什么区别”这个问题的诚实答案是 – 这两个函数之间没有任何明显的区别。它们都是相同的,一个是另一个的别名。如果你们中的任何一个人都能找到真正明显的差异,那么如果您能将其发布在本博客的评论部分,我将不胜感激。


-2
投票

当在脚本末尾调用

header()
时,无需调用
exit()
,也无需调用
die()
,因为:

脚本执行结束后,到服务器的链接将立即关闭,除非通过显式调用 mysql_close() 提前关闭。 - php.net/function.mysql-connect

© www.soinside.com 2019 - 2024. All rights reserved.