20

我有一个简单地使用的用户登录/注册系统

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

我最近读了一篇关于exit();并且die();不知道我应该使用这些的帖子。据我了解,他们使它结束了PHP?那是对的吗?我可以做到这一点的最佳方法是什么,只需在 header(); 之后直接添加这些函数之一;执行我有?

我有 AJAX、jQuery 通过我的 login.php/register.php 读取,这会有什么影响吗?

编辑:除了 header(); 之后,我还应该在哪里使用exit();ordie();函数?exit();更多地用于 PHP 而更多die();地用于 Perl?

4

6 回答 6

38

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

为什么要死()或退出():

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

不同之处:

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

退出()在行动

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

结果是:

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

死()在行动

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

结果是:

HTTP/1.1 304 Not Modified 
Connection: close

不同之处

所以,die()关闭连接,而exit()没有。是否要保持连接打开或关闭取决于性能。两者都有优点和缺点,取决于您的具体要求。

Wiki 上的 HTTP 持久连接

于 2014-01-05T10:31:47.303 回答
11

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

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

该函数用于中断脚本执行。您需要在 之后使用exitdie停止执行脚本header("Location: " . getenv("HTTP_REFERER"));,因为在其他情况下,您的脚本将执行到最后,这可能会导致一些意外行为。

于 2011-12-29T09:32:30.320 回答
4

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

header("Location: " . getenv("HTTP_REFERER"));
  1. 在用户代理方面,返回引用者是可选的

  2. 它很容易被伪造

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

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

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

于 2011-12-29T13:08:43.910 回答
3

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

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

一石两鸟——似乎对我有用。

于 2017-03-20T23:04:33.847 回答
0

header()在脚本结束时调用时,不需要调用exit()die()因为:

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

于 2014-04-14T13:17:46.867 回答
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() 有什么区别”这个问题,诚实的回答是——这两个函数之间没有一个明显的区别。它们都是一样的,一个是另一个的别名。如果你们中的任何人都能找到真正明显的差异,那么如果您能将其发布在本博客的评论部分,我将不胜感激。

直到下一次,快乐的 PHP 编程!

于 2019-08-20T07:13:51.180 回答