在运行脚本时,我会遇到以下几个错误:

警告:无法修改标头信息-标头已由第23行的/some/file.php中的/some-file.php发送(输出开始于/some/files.php:12)

错误消息中提到的行包含header()和setcookie()调用。

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


当前回答

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

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

对于我们通过FTP管理的站点,此修复程序非常简单,有时可以节省新团队成员的一些时间。

其他回答

这是因为这句话:

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

在发送邮件头之前,不应打印/回显任何内容。

另一种不良做法可能会引发尚未说明的问题。

请参见以下代码段:

<?php
include('a_important_file.php'); //really really really bad practise
header("Location:A location");
?>

一切都很好,对吧?

如果“a_import_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框架,该框架在将内容移交给控制器之前加载了大量文件,该怎么办?这种情况并不罕见。做好准备。

来自PSR-2.2:


所有PHP文件必须使用Unix LF(linefeed)行尾。所有PHP文件必须以一个空白行结尾。闭幕式?>标记必须从仅包含php的文件中省略


相信我,遵循这些标准可以为你的生活节省很多时间:)

通常,当我们在回显或打印后发送标头时,会出现此错误。如果在特定页面上出现此错误,请确保该页面在调用start_session()之前没有回显任何内容。

不可预测错误示例:

 <?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()函数之前不要输出任何字符,甚至不要输出空格或新行

我以前多次遇到过这个错误,我确信所有的PHP程序员都至少在以前遇到过一次这个错误。

可能的解决方案1

此错误可能是由文件开始之前或文件结束之后的空格造成的。这些空格不应在此处。

前)这里不应该有空格在这里回显“您的代码”;?>这里不应该有空格检查与导致此错误的文件关联的所有文件。注意:有时像gedit(默认的linux编辑器)这样的EDITOR(IDE)会在保存文件中添加一行空白。这不应该发生。如果您使用的是Linux。您可以使用VI编辑器删除?>之后的空格/行在页面末尾。可能的解决方案2:如果不是这样,则使用ob_start输出缓冲:<?php文件ob_start();//代码ob_end_flush();?> 这将打开输出缓冲,页面缓冲后将创建标题。

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

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

对于我们通过FTP管理的站点,此修复程序非常简单,有时可以节省新团队成员的一些时间。