【问题标题】:Is code after header("Location: ...) executed?是否执行了 header("Location: ...) 之后的代码?
【发布时间】:2011-04-11 05:57:27
【问题描述】:
$_SESSION["some_value"] = 4;
header("Location: another-file.php");
$_SESSION["some_value"] = 5;

$_SESSION["some_value"] 的值是多少?

【问题讨论】:

    标签: php redirect http-headers


    【解决方案1】:

    你应该总是在重定向之后 die() 或 exit() (或者正如 Mark B 所指出的,使用 ignore_user_abort() )因为你不能确定会发生什么。

    虽然某些代码会在标头位置重定向之后执行,但重要的是要注意并非所有在它之后的代码都一定会执行。

    根据您的示例,是的,some_value 将等于 5。但在某些时候脚本会过早终止。

    举个例子:

    session_start();
    $_SESSION["some_value"] = 'original value';
    header("Location: /index.php/test2");
    
    $start_time = microtime(true);
    
    for($i = 0; $i <= 100000; $i ++)
    {
        password_hash($i);  // slow it down
        $_SESSION["some_value"] = $i;   
        $_SESSION['time'] = microtime(true) - $start_time;
    }
    
    $_SESSION['some_value'] = 'finished!';
    

    如果所有其他答案都正确,您会假设 $_SESSION['some_value'] 等于“完成!” -- 但我运行了代码,但事实并非如此。

    这是我的结果:

    some_value: 174
    time: 0.0026998519897461
    

    试验二:

    some_value: 218
    time: 0.0033109188079834
    

    试炼三:

    some_value: 218
    time: 0.0035371780395508
    

    试炼四:

    some_value: 174
    time: 0.0026431083679199
    

    试炼五:

    some_value: 174
    time: 0.0027921199798584
    

    如果我实现了 ignore_user_abort(TRUE);在上面的脚本中, some_value 确实等于“完成!”所以如果你打算做一些重要的事情,比如日志记录或数据库查询,或者在重定向后发送电子邮件,请记住这一点。

    【讨论】:

    • 一个出色且内容丰富的答案 - 如果只有更多这样的答案,我现在已经接受它而不是以前接受的答案(我希望发帖人不会介意;这不像他需要积分;-)。谢谢
    【解决方案2】:

    发出标头后,您的代码和网络服务器/浏览器之间就开始了一场竞赛。通常,一旦浏览器收到重定向,它就会关闭运行脚本的连接并开始连接到新的重定向 URL。当连接关闭时,Web 服务器通常会尝试终止脚本。

    您可能很幸运,能够完成您想做的任何其他事情,或者您可能很不幸,在header() 调用之后脚本甚至无法到达下一行。

    ignore_user_abort() 函数,它应该让你的脚本继续,不管连接的状态如何。

    【讨论】:

    • 不,它仍然会下载整个响应,即使它有一个位置标头。这就是为什么您需要在标头之后调用exit;,如果您希望它在不执行更多代码的情况下进行重定向。如果它是否执行剩余代码是随机的,那么这将不是一个非常有用的功能,不是吗?
    • 这不是一个功能。提醒您浏览器以这种方式工作只是一个有趣的小错误。当然,他们没有。
    • @TorValamo 我不确定这是否完全准确。我一直在做一个项目,在该项目中我设置了位置标头而不退出,并且在本地,之后的代码没有执行,而当它被推送到开发服务器进行测试时,代码正在执行!
    • @billyonecan 我相信这与 php 引擎的配置有关。当这实际上是您想要的时,使用限制性选项总是更好。而不是希望开发服务器已经有了限制。
    【解决方案3】:

    header 命令不会中断您的代码流。即使遇到这种情况,浏览器仍然会下载您的页面,即使它没有显示。考虑 404 页面,这些页面(尽管是错误)仍然由浏览器处理(尽管它们在重定向时被渲染)。

    【讨论】:

      【解决方案4】:

      值为 5。

      除了Locationheader 之外,您还可以输出更多的标头,其中大部分您不想停止代码执行。如果要停止代码执行,需要显式调用exit

      【讨论】:

        【解决方案5】:

        当然 5. 你必须在这样的标题之后添加 exit()。

        【讨论】:

          猜你喜欢
          • 2013-08-08
          • 2023-03-25
          • 2021-10-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-01
          • 1970-01-01
          相关资源
          最近更新 更多