Home >php教程 >php手册 >如何解决PHP无法修改header信息问题

如何解决PHP无法修改header信息问题

WBOY
WBOYOriginal
2016-06-13 11:11:551148browse

在实际使用

比如以下这段PHP无法修改header信息的错误警告:

Warning: Cannot modify header information - headers already sent by

我们在刚刚开始编写PHP程序的时候,可能都遇到过这个问题。从字面上面看,意思是:

警告:不能修改header信息-headers已经发送。。。

那么是什么原因出现这个PHP无法修改header信息警告的呢!

就是当我们在header()或者setcookie()函数之前,有输出内容了,比如:

  1.  ?PHP  
  2. echo "hello";  
  3. header("content-type:
    text/html;charset:utf-8");  
  4. ?> 

上面的代码就会出现警告!

为什么在header和setcookie之前有任何的输出就会有警告错误呢!如果你了解了PHP的处理过程就很容易理解了!

那PHP是怎么处理PHP无法修改header信息的呢?

当脚本有任何输出的时候(第一次输出) PHP会先发送header信息给客服端 然后发送输出内容,(即http协议中的主体内容)这是如果你就不可能对已经发送的header信息进行任何的修改了,所以我们就不可能利用header 和setcookie等修改header的函数做任何事情了!

那我们来如果解决PHP无法修改header信息这个问题呢!

第一种方法很简单!就是尽量避免在header和setcookie之前有任何的输出内容。尽量将他们写在前面。

第二种解决办法就是利用PHP的outbuffer 输出缓冲,PHP的输出缓冲是这样的 ,将当前脚本的所有输出内容都放到outbuffer里面,当程序执行完毕之后 将header和outbuffer一并发送给客户端。

有两种做法 一种是在PHP.ini中开启outbuffer output_buffering默认值为0 可以设置为Off或者On 如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096)。

另一种PHP无法修改header信息方法是在PHP脚本中做开启:

在程序的开始出或者公共文件开始处 调用函数ob_start();

这样我们就开启了PHP的输出缓冲 下面我们就可以做任何操作了

<ol class="dp-xml">
<li class="alt"><span class="tag"> ?PHP   </span></li>
<li><span>ob_start();  </span></li>
<li class="alt"><span>echo "dfdfd";  </span></li>
<li><span>//注意不能卸载ob_start() 前面  </span></li>
<li class="alt">
<span>header("content-type:text/<br>html;</span><span class="attribute">charset</span><span>=</span><span class="attribute-value">utf</span><span>-8");  </span>
</li>
<li><span>setcookie();  </span></li>
<li class="alt">
<span class="tag">?></span><span> </span>
</li>
</ol>

如果要开始gzip 可以为ob_start添加ob_gzhandler回调函数 ob_start("ob_gzhandler");

关于outbuffer还有一些函数:

ob_flush()
发送output buffer(输出缓冲)

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

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

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

ob_get_clean()
将当前的output buffer返回成一个字符串。允许你处理脚本发出的任何输出,并禁用output buffering机制。

还有一些函数可以参考PHP手册 搜索ob_

<ol class="dp-xml">
<li class="alt"><span class="tag"> ?PHP  </span></li>
<li><span>ob_start();  </span></li>
<li class="alt"><span>print "Here's a pretty dumb way <br>to calculate the length of a string.";  </span></li>
<li>
<span>$</span><span class="attribute">length</span><span> = </span><span class="attribute-value">strlen</span><span>(ob_get_content());  </span>
</li>
<li class="alt"><span>ob_end_clean();  </span></li>
<li>
<span class="tag">?></span><span> </span>
</li>
</ol>

这个PHP无法修改header信息例子显示了一个效率很低的确定字符串长度的方法。它不是简单的使用strlen()函数处理,而是先启用 output buffering 机制,将字符串打印出来,然后再确定output buffer的长度。最后清除output buffer(并没有发送),然后禁用output buffering机制。


Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn