如何修复PHP中的“已发送邮件头”错误

如何修复PHP中的“已发送邮件头”错误,php,header,Php,Header,运行脚本时,我会遇到如下错误: <?php // Note the space before "<?php" ?> 警告:无法修改标题信息-标题已由第23行/some/file.php:12 in/some/file.php中启动的输出发送 错误消息中提到的行包含和调用 这可能是什么原因?以及如何修复它?在使用或发送HTTP头之前发送任何内容时,会触发此错误消息。在HTTP头之前输出内容的常见原因如下: 意外的空白,通常在文件的开头或结尾,如下所示: <?php /

运行脚本时,我会遇到如下错误:

 <?php
// Note the space before "<?php"
?>
警告:无法修改标题信息-标题已由第23行/some/file.php:12 in/some/file.php中启动的输出发送

错误消息中提到的行包含和调用


这可能是什么原因?以及如何修复它?

在使用或发送HTTP头之前发送任何内容时,会触发此错误消息。在HTTP头之前输出内容的常见原因如下:

意外的空白,通常在文件的开头或结尾,如下所示:

 <?php
// Note the space before "<?php"
?>
为了避免这种情况,只需省去结束语?>-无论如何,这不是必需的

在php文件的开头。使用十六进制编辑器检查php文件,以确定是否是这样。它们应该以字节3f3c开始。您可以安全地从文件开头删除BOM EF BB BF。 显式输出,例如在执行之前调用echo、printf、readfile、passthru和code

printf ("Hi %s,</br />", $name);

在设置cookies之前,这是不允许的。您不能在标题前发送任何输出,甚至不能发送空行。

这是因为这一行:

printf ("Hi %s,</br />", $name);
发送邮件头之前不应打印/回显任何内容。

发送邮件头之前不应输出任何内容! 在进行任何输出之前,必须调用发送/修改HTTP头的函数。 否则,调用将失败:

警告:无法修改标题信息-标题已发送,输出从脚本:行开始

修改HTTP头的一些函数包括:

/ / / 输出可以是:

无意的:

前空格 特别是 以前的错误消息或通知 有意的:

打印、回显和其他产生输出的功能 PHP之前的原始部分 应该省略关闭标记。这避免了一小部分这种情况。 通常包括的脚本是罪魁祸首

第0行中提到的未知错误源 如果没有错误源,它通常是一个PHP扩展或PHP.ini设置 它被具体化了

有时是gzip流编码设置 . 但它也可以是任何双重加载的extension=module 生成隐式PHP启动/警告消息。 前面的错误消息 如果另一个PHP语句或表达式导致警告消息或 请注意,打印出来时,这也算作过早输出

在这种情况下,您需要避免错误, 延迟语句执行,或使用以下命令抑制消息:。 或- 当任何一个都不妨碍以后的调试时

没有错误消息 如果根据php.ini禁用了错误报告或显示错误, 那么就不会出现任何警告。但是忽略错误并不能解决问题 离开在过早输出后仍无法发送标题

所以当标题位置:。。。自动重定向失败,这是非常困难的 建议探测警告。用两个简单的命令重新启用它们 在调用脚本顶部:

error_reporting(E_ALL);
ini_set("display_errors", 1);
或设置\u error\u handlervar\u dump;如果一切都失败了

说到重定向头,您应该经常使用这样的习惯用法 这适用于最终代码路径:

exit(header("Location: /finished.html"));
最好是打印用户消息的实用功能 在标头失败的情况下

作为解决方法的输出缓冲 PHPs 是缓解此问题的一个变通方法。它通常工作可靠,但不应该 替代正确的应用程序结构和将输出与控制分离 思维方式它的实际目的是最小化到Web服务器的分块传输

尽管如此,设置还是有帮助的。 在中配置它 或通过 甚至 现代FPM/FastCGI设置。 启用它将允许PHP缓冲输出,而不是立即将其传递给Web服务器。因此,PHP可以聚合HTTP头

同样,它也可以呼叫 在调用脚本的顶部。但由于多种原因,其可靠性较低:

即使启动第一个脚本,空格或 BOM可能在之前被洗牌

它可以隐藏HTML输出的空白。但一旦应用程序逻辑尝试发送二进制内容,例如生成的图像, 缓冲的无关输出成为一个问题。必须保持清洁 作为进一步的解决办法

缓冲区的大小有限,如果保留默认值,很容易溢出。 这种情况也不少见, 当它发生的时候

因此,这两种方法都可能变得不可靠,尤其是在两种方法之间切换时 开发设置和/或生产服务器。这就是为什么需要输出缓冲 被广泛认为只是一个拐杖/严格来说是一个解决办法

另见 在手册中,关于更多的优点和缺点:

但它在另一台服务器上工作!? 如果您之前没有收到标题警告,那么 已经改变了。它可能未在当前/新服务器上配置

正在检查发送的邮件头 您始终可以使用来探测 还是有可能。。。发送标题。这对于有条件地打印很有用 信息或应用其他回退逻辑

if (headers_sent()) {
    die("Redirect failed. Please click on this link: <a href=...>");
}
else{
    exit(header("Location: /user.php"));
}
有用的回退工作区 UND是:

HTML标记 如果您的应用程序在结构上很难修复,那么 允许重定向的有点不专业的方法是注入HTML 标签可通过以下方式实现重定向:

 <meta http-equiv="Location" content="http://example.com/">
或在短时间内:

 <meta http-equiv="Refresh" content="2; url=../target.html">
这会导致在使用超过该节时产生无效的HTML。 大多数浏览器仍然接受它

JavaScript重定向 作为备选方案a 可用于页面重定向:

 <script> location.replace("target.html"); </script>
虽然这通常比解决方案更符合HTML, 它依赖于支持JavaScript的客户端

然而,这两种方法在真正的HTTP头时都会有可接受的回退 呼叫失败。理想情况下,您总是将此与用户友好的消息和 点击链接作为最后手段。举个例子,什么是 PECL扩展没有

为什么setcookie和会话_启动也会受到影响 setcookie和session_start都需要发送一个Set Cookie:HTTP头。 因此,相同的条件适用,并将生成类似的错误消息 对于过早输出的情况

当然,浏览器中禁用的cookie会进一步影响它们 甚至是代理问题。会话功能显然也依赖于免费的 磁盘空间和其他php.ini设置等

进一步链接 谷歌提供了一个新的解决方案。 当然,我们也讨论了堆栈溢出。 WordPress常见问题解答以一般方式进行解释。 Adobe社区: Nucleus常见问题解答: 其中一个更透彻的解释是互联网档案链接。 它详细介绍了HTTP,并给出了一些重写脚本的指导原则。
一个简单的提示:在你的脚本中有一个简单的空格或不可见的特殊字符,就在第一个之前,我曾经多次遇到过这个错误,我确信所有的PHP程序员以前都至少遇到过一次这个错误

可能的解决办法1

此错误可能是由文件开始之前或文件结束后的空白空间引起的。这些空白空间不应该在这里。

前 这里不应该有空白
   echo "your code here";

?>
THERE SHOULD BE NO BLANK SPACES HERE
检查与导致此错误的文件关联的所有文件

注意:有时候像gedit这样的编辑器是默认的linux编辑器,在保存文件时添加一个空行。这不应该发生。如果您使用的是Linux。您可以使用VI编辑器删除页面末尾?>之后的空格/行

可能的解决办法2: 如果情况并非如此,则使用输出缓冲:

<?php
  ob_start();

  // code 

 ob_end_flush();
?> 

这将打开输出缓冲,页面缓冲后将创建标题。

而不是下面的行

//header("Location:".ADMIN_URL."/index.php");

echo("<script>location.href = '".ADMIN_URL."/index.php?msg=$msg';</script>");

这肯定会解决你的问题。
我遇到了同样的问题,但我通过以上述方式编写标题位置来解决。

另一个糟糕的做法可能会引发此问题,但尚未说明

请参阅以下代码片段:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>
一切都很好,对吗

如果一个重要的file.php是:

<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------
这行不通吗?为什么?因为已经生成了新行

现在,虽然这不是一个常见的场景,但如果您使用的是MVC框架,它在将内容移交给控制器之前加载了大量文件,该怎么办?这种情况并不少见。做好准备

所有PHP文件都必须使用Unix LF换行符。 所有PHP文件必须以一个空行结尾。 关闭?>标记必须从仅包含php的文件中省略
相信我,遵循这些标准可以为您节省大量的时间:

通常,当我们在回音或打印后发送标题时,会出现此错误。如果在特定页面上出现此错误,则在调用启动会话之前,请确保该页面未回显任何内容

不可预测错误的示例:

 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content
还有一个例子:

<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content
结论:在调用session_start或header函数之前,不要输出任何字符,即使是空白或新行

常见问题: 抄袭自:

====================

1不应有任何输出,即回波。。或标题前的HTML代码。。。。。。。;指挥部

2删除标签前的任何空格或换行符

3金科玉律检查该php文件,以及是否包含其他文件,这些文件不带BOM编码的UTF8,而不仅仅是UTF-8。在很多情况下,这是一个问题,因为UTF8编码的文件在php文件的开头有一些特殊字符,而您的文本编辑器不会显示这些字符

4在标题之后。。。;您必须使用出口

5始终使用301或302参考:

header("location: http://example.com",  true,  301 );  exit;
6打开错误报告,并查找错误。您的错误可能是由某个函数不工作引起的。打开错误报告时,应始终首先修复最上面的错误。例如,它可能是警告:date\u default\u timezone\u get:依赖系统的时区设置是不安全的。-然后再往下看,您可能会看到头未发送错误。修复最上面的第一个错误后,重新加载页面。如果仍然存在错误,请再次修复最上面的错误

7如果上述方法都没有帮助,请使用JAVSCRIPT重定向。但是,强烈不推荐使用的方法可能是 定制案例中的最后一次机会…:

echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;

有时,当开发过程同时拥有WIN工作站和LINUX系统托管,并且在代码中,在相关行之前没有看到任何输出时,可能是文件格式和缺少Unix LF linefeed 行尾

为了快速解决这个问题,我们通常会重命名文件,然后在LINUX系统上创建一个新文件,而不是重命名的文件,然后将内容复制到该文件中。很多时候,这解决了问题,因为WIN中创建的一些文件一旦移动到主机,就会导致此问题


此修复对于我们通过FTP管理的站点来说是一个简单的修复,有时可以为我们的新团队成员节省一些时间。

阅读:确保没有文本输出ob_start和ob_end_clean在这里可能会很有用。然后,您可以将cookie或会话设置为等于ob\u get\u contents,然后使用ob\u end\u clean清除缓冲区。使用我的PHP库中的safeRedirect函数:~~~~~~~~~~~~~~~您的文件编码不应该是UTF-8,但不带BOM的UTF-8~~~~~~~~~~~~~~ ob\u start只是隐藏了问题;不要用它来解决这个特定的问题。ob_start并没有隐藏问题,它解决了问题。当我将文件上传到服务器时,我遇到了这样一个问题,该服务器甚至支持PHP5.3使用PHP5.6或更高版本的服务器more@jack是的,我同意你的看法。理想的方法是在启动php标记之前删除空格,这样就解决了我的问题。根据Zend的几个标准,例如,在任何情况下都不应该在任何文件中放置closing?>标记。我无法在Windows环境中复制此标记,因为它可以使用任何组合添加closing标记、空格、按enter键、,这个问题似乎主要发生在Linux环境中,它应该是可复制的。你能分享你在gist或类似文章中试验的代码吗?我在Windows7上,安装了最新的Wamp。我认为这个bug与行尾的隐藏字符有关。我的Wordpress'shortcodes.php是问题的根源。我在这个文件中添加了一个简单的函数,它开始触发这个错误。我将shortcodes.php与wordpress进行了比较,结果还行,除了典型的Windows终端。我通过从Wordpress repo下载原始文件来解决这个问题,该文件使用LF Linux end of line而不是CR LF,并且我还将我的函数移到了theme的functions.php。基于:@Sahib,请注意,我仍然无法复制此答案中所述的内容。对于Linux环境来说,答案是完全正确的。我在?>之间测试过如此空白的东西。在Windows+Wamp中,所有这些组合都可以正常工作。Wierd…另外,常规notepad.exe也很棘手。我通常使用不添加BOM的NetBeans,即使文件是这样编码的。稍后在记事本中编辑文件会把事情搞砸,尤其是对于作为Web服务器的IIS。apache似乎放弃了按常规添加的BOM表。从php文件末尾删除结束?>通常是一个很好的做法,这也有助于将这些错误降至最低。不需要的空白不会出现在文件的末尾,以后您仍然可以向响应中添加标题。如果您使用输出缓冲,并且不希望在包含的文件生成的部分末尾添加不需要的空白,那么它也很方便。在它正常工作之前,但在这里它显示了这个错误。为什么?@PeterSMcIntyre UTF8 BOM可能会修复/未启用输出缓冲功能,但不要依赖于此。您可能需要添加的一个细节遗漏了$file=$line=null;头文件\u发送$file,$line;die$file:$line;如果错误消息忽略了该信息,将准确地告诉您发送了哪些标题。不知道为什么,但有时似乎是这样。为什么显式设置301或302很重要?如果在php.ini文件中设置了output_缓冲,则可以有输出。我家Debian系统上的我的设置为4096。我正在使用的服务器上的一个声明它没有设置。
<?php
//some php code 
//another line of php code
//no line above is generating any output
?>

 ----------This is the end of the an_important_file-------------------
 <?php //a white-space before <?php also send for output and arise error
session_start();
session_regenerate_id();

//your page content
<?php
includes 'functions.php';
?> <!-- This new line will also arise error -->
<?php
session_start();
session_regenerate_id();

//your page content
header("location: http://example.com",  true,  301 );  exit;
echo "<script type='text/javascript'>window.top.location='http://website.com/';</script>"; exit;