กรณีที่พูดถึงนี่ หมายถึง นำไปแก้ปัญหา

Warning: Cannot modify header information – headers already sent by…

 

ทำไมจึงได้พูดเยี่ยงนั้น

 

ob_start() นี่เป็นคำสั่งที่บอกไปยัง webserver ว่า ยูอย่าเพิ่งส่ง output ไปให้ client นะ รวบรวมไว้ก่อน รอให้สั่งหรือประมวล
ผลไปถึงบรรทัดสุดท้าย ก่อนแล้วค่อยส่ง นะจ๊ะ

 

ทีนี้ ขอเท้าความถึงกระบวนการประมวลระหว่าง client กับ server หน่อย

 

เมื่อยูสเซอร์พิมพ์ url ร้องขอ เพจที่เป็น php browser หรือจะเรียกว่า client ก็ได้ จะส่งคำร้องไปยัง server เมื่อ server ได้รับ
คำร้อง ก็ไปหาเพจที่ขอมา เมื่อเจอเพจที่ต้องการ ก็จะไปเรียกล่าม PHP มาช่วยแปล

 

ตอนแรกล่ามจะตรวจไวยากรณ์ก่อน ว่ามีตรงไหนผิดบ้าง ถ้ามีที่ผิดก็จะบอก server server ก็จะบอกไปยัง client นี่เป็นที่มาของ
error ต่างๆ ถ้าไม่มีที่ผิดเลย ก็จะเริ่มทำการแปลไปทีละบรรทัด ตั้งแต่บรรทัดแรกสุด ถ้ามี output ใดๆ ก็จะบอกไปยัง server server
ก็จะส่งสิ่งที่ได้ ไปให้ client client ก็จะรวบรวมและแสดงผลไปยัง user

 

ในระหว่างที่ server กำลังสื่อสาร กับ client อยู่นั้น ผู้เป็นล่าม ก็จะแปลไปเรื่อย ๆ ส่งเอ้าพุตออกมาเรื่อยๆ server ก็ส่งไปให้ client
เรื่อยๆ client ก็จะแสดงผลไปเรื่อยๆ

 

จะเห็นว่ากระบวนการ จะไม่มีการหยุดรอใครกัน ต่างคนต่างทำหน้าที่ของตัวเอง เพื่อแสดงผลแก่ user ให้เร็วที่สุด

 

แล้วที่บอกว่า “Cannot modify header ” header คืออะไร ?

 

ก่อนที่ server จะส่ง output แรกไปให้ client server จะส่งข้อมูลบางอย่างไปบอก client ก่อนว่า ยูเพจนี้นะแสดงผลแบบ html
encoding เป็น utf-8 นะ และอื่นๆ อีกจำนวนหนึ่ง เพื่อ client จะได้นำไปแสดงผลถูก ข้อมูลส่วนนี้แหละที่เขาเรียกว่า header

 

เริ่มเข้าเรื่องทีละน้อยแล้วล่ะ

 

ทีนี้ท่านลองคิดดูนะ server ได้ส่งข้อตกลง ( header ) ไปยัง client และส่งข้อมูลไปให้ ล่ามแปลอะไรได้มาก็ส่งไปให้ พอมาได้สัก
ระยะหนึ่ง ล่ามแปลไปๆ ไปเจอกับคำสั่งย้ายให้ไปแปลเอกสาร อันอื่น ( ในที่นี้คือคำสั่ง header() ) ล่ามก็หน้าซีดและบอก server
เสียงอ่อยๆ ว่าผมต้องแปลเอกสารอื่นนะ server ก็โมโหสิ เพราะคุยกับ client เป็นมั่นเป็นเหมาะแล้ว เลยตะโกนออกมาว่า เปลี่ยน
ไม่ได้ Cannot modify header ดังลั่นไปถึง programmer โฮ่ๆ

 

programmer ก็เลยสั่งจ่ายยา ob_start() ไปให้

 

มันก็แก้ได้อยู่หรอก แต่จะมีผลในเรื่องของ response time หรือระยะเวลาแสดงผลต่อ user เพราะเมื่อล่ามเห็นคำสั่งนี้ จะบอกกับ
server อย่างที่พูดไว้ด้านบน คือยังไม่ต้องส่งอะไรไปนะ รอก่อน เมื่อ server ยังไม่ส่งอะไรให้ client client ก็ต้องรอเช่นกัน

 

ด้วยประการฉะนี้แล