header image
Home
PHP ไม่ support BOM (utf-8 with BOM) PDF Print E-mail
Written by Administrator   
Sunday, 20 May 2007
หากคุณเจอปัญหา Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ... ทั้งๆ ที่ไม่เกี่ยวกับปัญหา white space คุณจะทำอย่างไร?

หากคุณทดลองเขียน PHP สั้นๆ แบบนี้
=====file var_web.php======
<?
session_start();
?>
========================
คือไฟล์ var_web.php มีแค่บรรทัดเดียวคือ session_start(); พอสั่ง run แล้ว ก็มีหน้าจอขึ้นแบบนี้ (ทั้งๆ ที่ก่อนหน้า <? ไม่มี white space)

Warning: session_start() [
function.session-start]: Cannot send session cookie - headers already sent by (output started at D:\webclients\village_farm\var_web.php:1) in D:\webclients\village_farm\var_web.php on line 2

ถ้าเป็นอีรูปแบบนี้ ขอให้รู้ไว้เถิดว่า ตัว editor PHP ของคุณทำพิษเข้าให้แล้ว โดยเฉพาะเมื่อ code ของคุณพัฒนาเป็นแบบ unicode (utf-8) แล้วจะบังเอิญหรือไม่ก็ตาม คุณดันไปใช้ editor ตัวอื่นๆ ที่ไม่ support unicode หรือ support unicode แต่ดันไม่มี option ให้เลือกเป็น utf-8 without BOM มาให้เลือก (เท่าที่ผมทราบในขณะที่เขียนอยู่ editor ที่ support utf-8 แล้วมี option utf-8 without BOM นั้นมี 2 ตัว คือ  DreamWeaver MX เวอร์ชันตั้ง 2004 ขึ้นไป และ Notepad++ ) ผลลัพธ์มันก็จะ error แบบข้างต้น

สาเหตุหรือครับ ผมขออนุญาต copy ข้อความจากเว็บไซต์ http://juicystudio.com/article/utf-byte-order-mark.php มาแสดงให้ดูก็แล้วกันนะครับ

Headers must be written before any data is sent to the client. Unicode files may include a Byte-Order Mark (BOM) to help distinguish the big endian and little endian byte order. Unfortunately, the BOM isn't understood by PHP. Upon encountering the BOM, PHP assumes that it is dealing with data, by which time it's too late to modify headers. Solution? Save the file in UTF-8 encoding without a BOM.

สรุปโดยย่อคือ PHP ไม่ support การใช้ utf-8 ที่มี BOM (ผมใช้ PHP 5.1.2) ดังนั้นเราจึงต้องสั่ง save code แบบ utf-8 without BOM ซึ่งผมแนะนำว่าให้ไปเปิด code เจ้าปัญหานี้ (ตัวอย่างในที่นี้คือ var_web.php) ใน DreamWeaver MX  แล้วเลือกที่เมนู Modify->Page properties -> Title/Encoding แล้ว สั่ง check box ตรงที่เขียนว่า Include Unicode Signature (BOM) ออก แค่นี้ก็จะแก้ปัญหาได้แล้ว

configurate Dreamweaver MX to use UTF-8 without BOM

ส่วนคนที่ใช้ Notepad ++ ก็สามารถทำได้เหมือนกัน และเพื่อป้องกันการสลับ code การแสดงผลไปมาที่ป็นสาเหตุของเรื่องวุ่นวายทั้งหลาย ให้ set ที่เมนู Setting->Preferences แล้วเลือกตามหน้าจอด้านล่างนี้เลยครับ คือให้มันเปิด document ใหม่ในทุกๆ ครั้งเป็น utf-8 without BOM ไปเลย (แต่ถ้าคุณไม่ได้ใช้ Notepad++ แล้วเขียนโปรแกรมด้วย code การแสดงผลเป็นแบบ utf-8 เป็นปกติ วิธีนี้ผมไม่แนะนำครับ ให้หันไปใช้ DreamWeaver MX จะดีกว่า เพราะมีความยืดหยุ่นในการสลับ code page ได้ดีกว่า)

Configurate Notepad++ to use UTF-8 without BOM

เรื่องเล่าท้ายบทความ
==============
ปัญหา UTF-8 without BOM นี่ เคยทำเอาผมเครียด เขม็งเกร็งเกรียวทีเดียว ขนาดกินไม่ได้ นอนไม่หลับ จำได้เม่นเลยว่า ตอนผมไป implement web-based ที่เป็น reservation system ที่รีสอร์ทแห่งหนึ่งที่เกาะช้าง เมื่อปี 2550 ผมมีเวลาแค่ 7 วันในการ implement+training แต่ผมต้องเสียเวลาเกือบ 3 วันเต็มๆ ไปกับการแก้ปัญหาดังกล่าว

ตอนนั้นยอมรับว่า ความรู้สึกมืดตึ๊บไปหมด มองไม่เห็นทางออก แม้ท้องฟ้าทะเลที่เกาะช้างจะฉายแสงเจิดจ้าอย่างสวยงามแท้ๆ แต่ผมก็ไม่มีอารมณ์จะรับรู้ถึงความสวยงามแห่งท้องทะเลนั้นเลย และไม่ทราบสาเหตุเลยครับว่าทำไม source code PHP ที่ผมทดสอบมาอย่างดีจากกรุงเทพ ทำไมมันถึงได้มีปัญหามากมายอะไรขนาดนั้น
 ทั้งยังทำให้ผมเสียหน้าอย่างรุนแรง ลูกค้าเขาไม่ได้ว่าหรอกครับ แต่ด้วยสายตาบวกกับความกังวลของเขา ทำให้ผมรู้สึกถึงความไร้ซึ่งมืออาชีพของผมอย่างเห็นได้ชัด

บวกกับการสื่อสารทางอินเทอร์เน็ตที่เกาะช้างในช่วงเวลานั้นก็มีปัญหา ADSL ของ TOT ล่มบ่อยมาก  แต่โชคก็ยังพอช่วยอยู่ เพราะที่รีสอร์ทนั้นเขามี computer ต่อเข้ามือถือแล้วใช้เน็ตผ่าน GPRS เป็นระบบสำรอง ไว้ใช้อินเทอร์เน็ตยามฉุกเฉิน (ได้แค่ 80-100Kbps/sec)

ด้วยปัญหาที่แก้ไม่ตก ผมตัดสินใจให้ลูกทีมส่งไฟล์ source code ทั้งชุดเข้ามาติดตั้งยังเซิร์ฟเวอร์ที่ รีสอร์ท ยอมเสียเวลา 2-3 ชั่วโมง ซึ่งก็ลุ้นน่าดูว่าผลจะเป็นอย่างไร จากนั้นปัญหาพวก error แปลกๆ ก็หาย วันนั้นเป็นวันที่ 4 ทำให้ผมเหลือเวลาติดตั้งแค่ 2 วัน + ทำ training อีก 1 วัน เป็นอันหมดเวลา สรุปว่าไม่มีเวลาทำ testing ครับ แล้วที่สำคัญ!!!! ทำให้อดเที่ยวเกาะช้างเลย :(

แต่เคราะห์ยังดีที่ผมกับลูกทีมที่เดินทางไปที่นั่นติดตั้ง + implement ซอฟต์แวร์สำเร็จ ไม่อย่างงั้นคงได้หน้าแหกกลับมา ไหนจะถูก boss ใหญ่ตำหนิแล้ว ลูกค้าก็ยังมองตาขวางอีกด้วย :)

ปัญหา UTF-8 without BOM นี่เป็น ปัญหาเส้นผมบังภูเขา ผมเลยไม่อยากให้เพื่อนๆ ที่ใช้ PHP มาตกนรกในห้วงเวลานั้นแบบผม เลยตั้งใจจะมาแบ่งปันประสบการณ์ให้ฟังครับ

kuzmiraun at yahoo.com

Last Updated ( Friday, 13 June 2008 )
หากคุณเจอปัญหา Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at ... ทั้งๆ ที่ไม่เกี่ยวกับปัญหา white space คุณจะทำอย่างไร?
Polls
ภาษาอะไร ที่คุณชอบนำมาเขียนเป็น web-application?
  
Who's Online
We have 5 guests online