现在的位置: 首页 > 综合 > 正文

PHP经典header错误”Cannot modify header information”的解决方法(转)

2018年04月30日 ⁄ 综合 ⁄ 共 2139字 ⁄ 字号 评论关闭

错误提
示:Cannot modify header information - headers already sent by ....

 

原文地址:
http://www.phpchina.com/html/47/26247-8026.html

 

昨晚在转换编码的时候,有一个
页面需要在head中申明utf-8的编码,但是这与程序中的一处header产生了冲突。google了一下,找到几种解决方法,翻译整理一下:

If you got
this message: "Warning: Cannot modify header information - headers
already sent by ...."

如果在执行php程序时看到这
条警告:"Warning: Cannot modify header information - headers already sent by
...."

Few notes
based on the following user posts:

有以下几种解决方法:

1.
Blank lines (空白行):

Make sure no
blank line after <?php ... ?> of the calling php scrīpt.

检查有<?php
... ?> 后面没有空白行,特别是include或者require的文件。不少问题是这些空白行导致的。

2. Use
exit statement (用exit来解决):

Use exit after
header statement seems to help some people

在header后加上
exit();

header
("Location: xxx");

exit();

3.
PHP has this
annoying problem, if your HTML goes before any PHP code or any header
modification before redirecting to certain page, it ll said "Warning:
Cannot modify header information - headers already sent by ...."
Basically anytime you output to browser, the header is set and cannot
be modified. So two ways to get around the problem:

3a.
Use Javascrīpt (用Javascrīpt来解决):

<? echo
"<scrīpt> self.location( file.php );</scrīpt>"; ?>

Since it s a
scrīpt, it won t modify the header until execution of Javascrīpt.

可以用Javascrīpt来
代替header。另外需要注意,采用这种方法需要浏览器支持Javascrīpt.

3b.
Use output buffering (用输出缓存来解决):---本人用这种方法解决的!已证实可以!

<?php
ob_start(); ?>

...
HTML codes ...

<?php

...
PHP codes ...

header
("Location: ....");

ob_end_flush();

?>

This will save
the output buffer on
server and not output to browser yet, which means you can modify the
header all you want until the ob_end_flush() statement. This method is
cleaner than the Javascrīpt since Javascrīpt method assumes the browser
has Javascrīpt turn on. However, there are overhead to store output
buffer on server before output, but with modern hardware I would
imagine it won t be that big of deal. Javascrīpt solution would be
better if you know for sure your user has Javascrīpt turn on on their
browser.

就像上面的代码那样,这种方法
在生成页面的时候缓存,这样就允许在输出head之后再输出header了。本站的许愿板就是采用这种方法解决的header问题。

4.set
output_buffering = On in php.ini (开启php.ini中的output_buffering )

set
output_buffering = On will enable
output buffering for all files. But this method may slow down your php
output. The performance of this method depends on which Web server you
re working with, and what kind of scrīpts you re using.

这种方法和3b的方法理论上是一样
的。但是这种方法开启了所有php程序的输出缓存,这样做可能影响php执行效率,这取决于服务器的性能和代码的复杂度。 

抱歉!评论已关闭.