- 浏览: 406140 次
- 性别:
- 来自: 上海
-
文章分类
最新评论
-
goahead2010:
有用
JS遍历对象或者数组 -
bishibaodian:
不要在这样找笔试题了,一次就这么几个,还没过瘾就没有了,去安装 ...
整理了一份招PHP高级工程师的面试题 -
smallearth:
不错
整理了一份招PHP高级工程师的面试题 -
ipodao:
暂时没发现啊!
IE域名带有下划线导致的session丢失 -
ipodao:
谢了
JS遍历对象或者数组
PHP错误:Warning: Cannot modify header information - headers already sent by
- 博客分类:
- PHP
如果在执行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:
3.a. 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.
3.b. 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执行效率,这取决于服务器的性能和代码的复杂度。
贰 ---------------------------------------------------------
如何彻底杜绝warning: Cannot add header information - headers already sent in…… 这种令人莫明其妙的的错误。 只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它
首先:这错误是怎么产生的呢?让我们来看看PHP是如何处理HTTP header输出和主体输
文讨论的是如何彻底杜绝warning: Cannot add header information - headers already sent in…… 这种令人莫明其妙的的错误。
只要你写过PHP代码,相信都遇上过这个大多时候都令人莫明其妙的warning吧..今天我们就来搞定它……………
看了PHP手册,回答如下:
消息“Warning: Cannot send session cookie - headers already sent…”或者“Cannot add/modify header information - headers already sent…”。
函数 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)就是基于这种原理的。
出的。 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) 就是基于这种原理的。
发表评论
-
引用和global
2013-02-01 18:05 857<?php $var1 = 1; $var ... -
面向对象之多态
2013-02-01 17:49 995Java实现 //定义接口Animal interf ... -
PHP HTTP Authentication
2012-11-22 17:39 904<?php $config['admin_ ... -
PHP实现的栈
2012-11-16 13:44 984<?php class Stack{ ... -
pearl && pecl
2012-09-21 15:02 976Pear:是PHP的扩展代码包,所有的扩展均以PHP代码的形式 ... -
PHP集成PayPal
2012-09-18 18:34 18961.注册开发者账号,注册完登陆,然后新建一个Business账 ... -
PHP中 Magic quotes
2012-06-26 17:45 1341什么是 Magic Quotes? Magic Quo ... -
php请求
2012-06-20 15:25 984wev-server处理一个php请求,是给 ... -
一个CURD的demo
2012-06-13 16:19 0一个后台管理的demo -
php
2012-06-09 18:22 0redis是个单线程的程序,为什么会这么快呢?每秒100 ... -
PHP的工作模型
2012-06-05 17:16 1382http://www.mike.org.cn/arti ... -
phpstorm3.0以下的注册码
2012-03-31 09:52 912EMBRACE ===== LICENSE B ... -
call_user_func函数和call_user_func_array函数
2012-03-09 14:56 10111.call_user_func函数是当需要动态调用函数时,才 ... -
SNS
2012-03-08 16:09 01.AS可以打包多个请求成一个包然后一起发送,服务端然后一个一 ... -
PHP this,self 和 parent 关键字
2012-02-29 22:23 898我们先建立几个概念,这三个关键字分别是用在什么地方 呢? ... -
一些截取的函数
2012-02-29 18:33 0<?php $str = 'abcdk123 ... -
细说PHP中strlen和mb_strlen的区别
2012-02-29 16:53 1328在PHP中,strlen与mb_strlen ... -
PHP数据库
2012-02-28 16:36 0但对于 PHP 语言来说它是放在 Apache 上的,每一个请 ... -
PHP取权重
2012-02-17 14:42 1075在实际的开发过程中,经常会用到一些几率的时间,例如有这样一个奖 ... -
整理了一份招PHP高级工程师的面试题
2012-02-08 09:04 422541. 基本知识点 HTTP协议中几个状态码的含义:1xx( ...
相关推荐
今天在测试以下代码时遇到该错误: 复制代码 代码如下: ...Warning: Cannot modify header information – headers already sent by… 看了一些网上的方法也没解决,最后在php.ini配置output_buffering默认为4096
在讨论PHP编程时,我们经常会遇到一个常见的错误提示:“Warning: Cannot modify header information - headers already sent by”。这个警告通常是由于开发者在尝试发送HTTP头信息之后,又进行了输出操作而引起的。...
在PHP编程过程中,有时会遇到一个常见的错误提示:“Cannot modify header information - headers already sent by...”。这个错误通常意味着在尝试使用`header()`函数或者`setcookie()`函数修改HTTP头信息时,已经...
port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in D Cannot modify header information - headers already sent by (output started at D100) in D Cannot modify header ...
使用setcookie()函数时总是报以下错误: Warning: Cannot modify header information – headers already sent by…. 解决办法如下: 方法一: 在PHP里Cookie的使用是有一些限制的。 1、使用setcookie必须在<...
用途:主要用于整站所有文件为utf8无bom文件,个别文件却存bom,而造成的如:Warning: Cannot modify header information - headers already sent 等的错误。 如何解决BOM:先放在服务器可执行目录下,使用 浏览器http://...
<?php ob_start(); setcookie(“username”,”宋岩宾”,time()+3600);... Warning: Cannot modify header information – headers already sent by出错的原因 我在php程序的头部加了, header(“cache-control
Warning: Cannot modify header information – headers already sent by (output started at…… 这种提示,彼岸世界上的处理是“解决方法为:在functions.php 的最上面一行 添加函数 ob_start(); 即可”,但实际试...
reporting = E_ALL的情况下,输出内容之后再setcookie会弹出以下提示: 复制代码 代码如下: Warning: Cannot modify header information – headers already sent by (output started at C:\xampp\htdocs\b.php:...
下面测试ob缓存和程序缓存:在测试前为了测试效果更明显,我们在php.ini...则会出现phpWarning: Cannot modify header information – headers already sent by (output started at D:\www\apache\htdocs\test\t2
Warning: Cannot modify header information – headers already sent echo 'hello1'; header('content-type:text/html;charset=utf-8'); echo 'hello2'; 开启OB缓存的方式有如下两种: 1. php.ini中开启 output_...