กรณีที่พูดถึงนี่ หมายถึง นำไปแก้ปัญหา
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 ก็ต้องรอเช่นกัน
ด้วยประการฉะนี้แล
light says:
06/05/2553 at 06/05/2553
ขอบคุณครับ อธิบายเห็นภาพเลยครับ
CheapCamera says:
23/08/2553 at 23/08/2553
ใช้ได้ แต่ไม่แนะนำ = =”
Ars_BeaL says:
26/08/2553 at 26/08/2553
เข้าใจแล้วครับ เหอๆ อ่านไป ยิ้มไป
web says:
14/12/2553 at 14/12/2553
อธิบายได้สุดยอดจริงๆครับผม
หึหึ says:
03/06/2554 at 03/06/2554
แทบไม่มีความต่างเลยระหว่างการทำ ob กับ ไม่ทำ ความหน่วงต่างกันระดับ miliseconds
อีกอย่าง ob_start สามารถ call back ใช้กับ gz handler
อีกอย่าง ob มันทำให้ server ต้องทำงานเพิ่มขึ้นเวลาใช้จะให้ดีต้องคู่กับ gzlib
man says:
10/08/2555 at 10/08/2555
สุดสวยจิงๆๆ ครับอาจารย์ อธิบาย ได้เข้าใจจริงๆๆ
Game says:
15/08/2557 at 15/08/2557
รู้ซึ่งถึงรสพระธรรมเลยครับ