如何修复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;