解决 PHP 错误: Headers already sent


在 PHP 有一种很常见的 Warning 错误是 headers already sent, 出现时类似这样:

Warning: Cannot modify header information – headers already sent by (output started at /path/to/file.php:20) in /path/to/file on line 23

这是在使用 session, setcookie 或 header 前, 有输出内容所致, 输出的不一定是文字, 可以是空格或空行。所以解决方法是将这些函数前的网页输出移除, 或者放在以上函数后便可以。

例如要用 PHP 的 header() 函数来转址, 写法是这样:

以上程式码会将网页转址到 http://www.phpini.com/, 但如果在 header() 函数前有输出内容, 便会出现错误:

以上程式码, 由于在 header() 函数前有用 echo 印出”Hello World!”, 所以会出现 “headers already sent” 错误。再看另一个例子:

以上 PHP 程式码虽然 header() 函数前没有 echo 或 print, 但由于已经有 HTML 输出, 所以同样会出现 “headers already sent” 错误。

要解决以上错误, 最简单是将 header() 函数放到网页输出前面。

另一个方法是使用 ob_start(), 在档案开头加上 ob_start(), 及最后加上 ob_end_flush(), 例如:

除了修改 PHP 程式码外, 还可以修改 php.ini 设定, 开启 php.ini 档案, 找到 “output_buffering” 一行, 默认是 Off, 改成 On 后重新启动 Apache 便可以了。

Tags:

Leave a Reply