PHP脚本会在标头重定向后执行吗?

php
2022-08-30 13:57:47

是的,这个问题以前问过,但是,答案并不一致。例如,为什么我必须在PHP中通过标头('Location..')重定向后调用“exit”。。每个答案(包括接受的答案)都表示是,除了最后一个答案,它获得了零票,上面写着“也许”。我开始认为正确的答案是“也许”。为了使它成为一个简单的“是”或“否”问题,在给定以下脚本的情况下,doThis()是否会被执行?谢谢

header('Location: http://somewhereElse.com');
//die();
sleep(1000);
doThis();

编辑 谢谢大家。使用我的PHP / Linux / Apache配置,第二个syslog()执行,所以答案是“是的,标头的所有脚本都将被执行。我会假设(并希望我是正确的)它与所有PHP / Linux / Apache配置相同!

<?php
  header('Location: http://google.com');
  syslog(LOG_INFO,'first');  
  sleep(5);
  syslog(LOG_INFO,'Second');  
?>

答案 1

是的,如果您不显式终止脚本,脚本在调用后继续处理!我只是在本地尝试了这个。我将 test.php 添加到 apache 中的站点,其中包含以下内容:header('Location: http://google.com')

<?php

header('Location: http://google.com');
error_log("WE MADE IT HERE SOMEHOW");

?>

并检查了我的 /var/log/apache2/error_log 中的此条目:

[Tue Feb 12 23:39:23 2013] [error] [client 127.0.0.1] WE MADE IT HERE SOMEHOW

可能令人惊讶,但是是的,如果您不停止执行,它将继续执行。


答案 2

人们似乎对此感到非常困惑,至于为什么执行脚本。当您发送重定向标头时,浏览器会立即将用户重定向到新页面,但即使最后没有人接收代码,您的服务器也将继续处理代码,这并不意味着脚本已终止。除非您将Apache配置为在脚本意识到另一端没有人时停止脚本。

当 PHP 脚本正常运行时,NORMAL 状态为活动状态。如果远程客户端断开连接,则 ABORTED 状态标志处于打开状态。远程客户端断开连接通常是由用户点击其 STOP 按钮引起的。

您可以决定是否希望客户端断开连接以导致脚本中止。有时,即使没有远程浏览器接收输出,也始终让脚本运行到完成是很方便的。但是,默认行为是在远程客户端断开连接时中止脚本。此行为可以通过 php.ini 指令以及相应的 apache httpd.conf 指令或函数php_value设置。ignore_user_abortignore_user_abortignore_user_abort()

无需进一步操作即可重定向用户的正确方法是:

header("Location: blah.php");
exit();

推荐