在用php写代码时遇到Cannot send session cookie - headers already sent by (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functi

Warning Cannot send session cookie - headers already sent...问题的解决(PHP的UTF-8 BOM引起的问题)

习惯了用edit plus进行php编程,所以有时会出现一些不为人知的错误,很麻烦;。
近日,在开发项目时,某些页面总是出现以下问题:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functions\sessions.php on line 67

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functions\sessions.php on line 67
经过详细搜索,得到以下原因:
我的edit plus中设置了默认的编码为utf-8,且UTF_8签名为:总是添加签名;
于是尝试以下操作:
在edit plus 的工具->参数->文件->UTF_8签名一项中,更改选项"总是添加签名"为"总是移除签名",然后打开index.php文件,并重新另存为,重新运行脚本,终于可以正常了;

另外,在网上找到了两篇比较有参考价值的文章,希望有人碰到此种情况时可以完美解决!

一个UTF-8 BOM引起的PHP的诡异问题
一、
//---a.php
<?php
header("Content-Type: image/BMP");
session_start();
................
?>
将a.php保存为utf-8格式,结果用浏览器访问这个php文件,就会出现如下错误:
Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at ×××.php:1) in ×××on line 2

这个问题很常见,多数是因为在session_start之前有输出了!对于老鸟来说,这个错误基本上不会发生,但是如果你是用DW或是editplus等编

辑器写代码的,连高手也有可能发生这个错误!

如上面的提示:在第×××文件的第1行,×××文件的第2行,随你看,这两处是不会有任何输出语句的,很奇怪还是会出错,为什么呢
原来:Unicode 签名 (BOM) 可在文档中包括字节顺序标记 (BOM)。BOM 是位于文本文件开头的 2 到 4 个字节,可将文件标识为 Unicode,如果是这样,还标识后面字节的字节顺序。由于 UTF-8 没有字节顺序,因此可以选择添加 UTF-8 BOM。对于 UTF-16 和 UTF-32,这是必需的。
看见没有!如果选了这个选项,就会在页面的最前面输出2到4个字节!
而 session_start() 要求之前没有任何输出给客户端浏览器

二、另外还有一个地方可能会出错,例如:
/--a.php--
?>
空行
空行

如果你包含a.php之后再来也会有这个问题,通常的建议是经常被包含的文件末尾不要有?>
又如:在调用Session_Start()之前不能有任何输出.例如下面是错误的.
==========================================
1行
2行<?PHP
3行 Session_Start();//之前在第一行已经有输出
4行.....
5行?>
==========================================
已经经过试验,事实确实是如此诡异。

三、session_start()、set_cookie()、header()前面都加上@应该可以抑制这个警告。

四、在editplus编辑器中,如果先把utf-8的a.php文件转换为gb2312或是其他,然后再转换为utf-8这样就可以成功访问了,也就是说文件开头的BOM被去掉了,这时候的UTF-8 是无BOM类型的了

PHP-关于utf-8编码问题引起的session_start()错误

采用默认的gb2312编码时,兼容Ansi编码,文件头部无任何附加信息,此时session_start()可以正常工作。采用utf编码时,大部分编辑器都会在在文件头部附加一个BOM块,我的EditPlus附加的是FF FE,用16进制编辑器可以很清楚的看到。这样,当调用session_start()时,实际上已经向浏览器输出两个字节,只不过是不可见字符浏览器中出现如下警告:
Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ......................
解决方法:
1、手动去掉BOM块,可以在16进制编辑器如UltraEdit中编辑,或者采用编辑器自带的功能,好的编辑器一般提供选择是否去除BOM块。
2、自己编写脚本更正,这要针对不同的编辑器,BOM头定义:
UTF-8

EF BB BF
UTF-16 Big Endian               FE FF
UTF-16 Little Endian            FF FE
UTF-32 Big Endian               00 00     FE FF
UTF-32 Little Endian            FF FE 00 00

时间: 2024-09-28 22:17:32

在用php写代码时遇到Cannot send session cookie - headers already sent by (output started at E:\web\Apache2\htdocs\index.php:1) in E:\web\Apache2\htdocs\functi的相关文章

今天和组内一起写代码时碰到了一个关于命名冲突的问题,最后用js命名空间的方法解决的。

//第一步,首先创建一个全局变量,可以放在自己的js方法库中方便以后用,这个就是用来注册命名空间的方法. ns = function(namespace){ var arr = namespace.split('.');  //将传入的字符串如"com.test.lzn"以'.'隔开做成一个数组 var strNamespace = ""; //这个是为了保存每一步循环进去的包名 for(var i=0;i<arr.length;i++) { if(i!=0)

html基础,写代码时的总结等---ShinePans

index.html: <html> <meta http-equiv="content-type" content="text/html;charset=UTF-8"/> <head> <body> <center> <!--空格  --> <!--img src="与html文件位置相同或者本地url或者网络url" width="xxpx为边框宽度&qu

写代码时常见的错误

实验室有要做阶段练习题了,其中有一道改bug题: #include <iostream> #include <vector> int main(int, char**) { std::vector<int>** ppRandomData = distributeRandomInt(100); for (unsigned int i=0; i<1000; i++) { if (ppRandomData[i]) { std::cout << "E

PHP对大小写敏感问题的处理比较乱,写代码时可能偶尔出问题,所以这里总结一下。以便用到的出现错误

推荐大家始终坚持“大小写敏感”,遵循统一的代码规范. 1. 变量名区分大小写 1 <?php 2 $abc = 'abcd'; 3 echo $abc; //输出 'abcd' 4 echo $aBc; //无输出 5 echo $ABC; //无输出 2. 常量名默认区分大小写,通常都写为大写 (但没找到能改变这个默认的配置项,求解) 1 <?php 2 define("ABC","Hello World"); 3 echo ABC; //输出 Hel

vs的一些操作技巧:在写代码时自动换行的设置

有时在写代码的时候,一行代码太长了,想换行,直接按回车键的话又会报错,怎么办?其实可以这样设置vs,就可以达到自动换行的效果啦. ? 原文地址:https://www.cnblogs.com/Teacher-Lu/p/11673048.html

程序员写代码时应该反复问自己的 10 个问题

你想成为一名优秀的程序员吗? 那么,现在是时候放下<24小时学会xxx语言v8.3>超级骗子书,相反,你应当养成每天反问自己以下10个问题的习惯. 你的代码中是否有一种模式存在? 找寻模式中的可行与不可行将发现其中看似无关的想法或基本原则.要对工作达到深入的理解,你必须养成反问自己“是否有一种模式存在?”的习惯. 它不仅仅适用于你的代码.是否有适应各类型商业变化的模式吗?是否有一种适用于技术发展的模式?你有没有看到同类型的错误如雨后春笋般冒出来? 引用 所谓理解就是要理解模式 — 以赛亚·伯林

【转】程序员写代码时应该反复问自己的10个问题

你想成为一名优秀的程序员吗? 那么,现在是时候放下<24小时学会xxx语言v8.3>超级骗子书,相反,你应当养成每天反问自己以下10个问题的习惯. 你的代码中是否有一种模式存在? 找寻模式中的可行与不可行将发现其中看似无关的想法或基本原则.要对工作达到深入的理解,你必须养成反问自己“是否有一种模式存在?”的习惯. 它不仅仅适用于你的代码.是否有适应各类型商业变化的模式吗?是否有一种适用于技术发展的模式?你有没有看到同类型的错误如雨后春笋般冒出来? 所谓理解就是要理解模式 — 以赛亚·伯林 怎么

写代码时应该反复问自己的10个问题

英文原文:10 Questions web developers must ask themselves every day 你想成为一名web开发者吗? 那么,现在是时候放下<24小时学会超级骗子语言v8.3>书,相反,你应当养成每天反问自己以下10个问题的习惯. 1.是否有一种模式存在? 找寻模式中的可行与不可行将发现其中看似无关的想法或基本原则.要对工作达到深入的理解,你必须养成反问自己“是否有一种模式存在?”的习惯. 它不仅仅适用于你的代码.是否有适应各类型商业变化的模式吗?是否有一种

java写代码时的一些注意点

1. if(username.equals(“zxx”)){} 这样写的话,如果username是null, 则会报NullPointerException,所以先要判断username是否为null. 2.  int  x = 1; return x==1?true:false; 不会报错,但特别啰嗦.如果要返回boolean, 那么可以直接return x==1, (x==1这个表达式本来就返回boolean)