php 办理Warning: Cannot modify header information headers a(2)

函数 header(),setcookie() 和 session 函数需要在输出流中增加头信息。可是头信息只能在其它任何输出内容之前发送。在利用这些函数前不能有任何(如 HTML)的输出。函数 headers_sent() 可以或许查抄您的剧本是否已经发送了头信息。请参阅“输出节制函数”。

意思是:不要在利用上面的函数前有任何文字,空行,回车,空格等。但。。。问题是,这谜底并不令人满足。因为往往措施在其他PHP情况下运行却正常。

首先:这错误是怎么发生的呢?让我们来看看PHP是如那里理惩罚HTTP header输出和主体输出的。

PHP剧本开始执行时,它可以同时发送header(标题)信息和主体信息。 Header信息(来自 header() 或 SetCookie() 函数)并不会当即发送,相反,它被生存到一个列表中。 这样就可以答允你修改标题信息,包罗缺省的标题(譬喻 Content-Type 标题)。可是,一旦剧本发送了任何非标题的输出(譬喻,利用 HTML 或 print() 挪用),那么PHP就必需先发送完所有的Header,然后终止 HTTP header。尔后继承发送主体数据。从这时开始,任何添加或修改Header信息的试图都是不答允的,并会发奉上述的错误动静之一。

好!那我们来办理它:笨要领:把错误告诫全不显示! 掩耳盗铃之计
error_reporting(E_ERROR | E_PARSE); 这里不要显示E_WARNING即可

办理方案:
1)合用于有权限编辑PHP。INI的人
打开php。ini文件(你应试比我清楚你的php。ini在那边),找到
output_buffering =改为on可能任何数字。假如是IIS6,请必然改为ON,否则你的PHP效率会奇慢。

2)利用虚拟主机,不能编辑PHP。INI,怎么办?

简朴:
在你的空间根目次下成立一个。htaccess文件,内容如下:

AllowOverride All
PHP_FLAG output_buffering On

不幸的环境是:照旧不可?全部网页都不能显示啦?

那么,再用下面的要领:

在PHP文件的最开始插手:ini_set("output_buffering", "1");

让这个页面打开PHP的输出缓存。

3)在PHP文件里办理

ob_start()
启用output buffering机制。 Output buffering支持多条理 — 譬喻,可以多次挪用 ob_start() 函数。

ob_end_flush()
发送output buffer(输出缓冲)并禁用output buffering机制。

ob_end_clean()
排除output buffer但不发送,并禁用output buffering。

ob_get_contents()
将当前的output buffer返回成一个字符串。答允你处理惩罚剧本发出的任何输出。

道理:
output_buffering被启用时,在剧本发送输出时,PHP并不发送HTTP header。相反,它将此输出通过管道(pipe)输入到动态增加的缓存中(只能在PHP 4。0中利用,它具有中央化的输出机制)。你仍然可以修改/添加header,可能配置cookie,因为header实际上并没有发送。当全部剧本终止 时,PHP将自动发送HTTP header到欣赏器,然后再发送输出缓冲中的内容。

4)绝杀能力
假如以上要领都不能比及满足的办理步伐,请用如下步伐:

先用记事本打开呈现问题的网页,另存为ANSI编码的同名文件。
再用EditPlus将该文件另存为UTF-8编码的文件。
再试试,应该可以显示了。
造成的原因主要由以下两点:
一:在Header()函数之间输出了其他内容(一般由欣赏器埋没发送),导致了厥后的Header不能再次发送新的页面范例。这可以通过开启Output_Buffering来办理,要领2)与3)就是这样。
二:PHP文件回收UTF-8编码,由于编码不兼容(出格是通过其他编码转换过来的),发生了BOM《在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不该该呈此刻实际传输中。UCS类型发起我们在传输字节约前,先传输 字符"ZERO WIDTH NO-BREAK SPACE"。这样假如吸收者收到FEFF,就表白这个字节约是Big-Endian的;假如收到FFFE,就表白这个字节约是Little- Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被称作BOM。
UTF-8不需要BOM来表白字节顺序,但可以用BOM来表白编码方法。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8编码是EF BB BF。所以假如吸收者收到以EF BB BF开头的字节约,就知道这是UTF-8编码了。

Windows就是利用BOM来标志文本文件的编码方法的。》导致了的头文件不能正确识别,这时只要去除UTF-8文件中的BOM就可以了,要领4)就是基于这种道理的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/7709.html