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
習慣了用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
UTF-16 Big Endian
UTF-16 Little Endian
UTF-32 Big Endian
UTF-32 Little Endian