ob_end_flush() error

จริงๆแล้ว error ที่เกิดนี้ค่อนข้างซับซ้อนนิดนึง เนื่องจากมันไม่ได้มีปัญหาทุกครั้งที่เรียกใช้ และสาเหตุแต่แรกก็ไม่ได้พุ่งเป้าไปที่ตัวนี้หรอก แต่จากการไล่ debug เป็นส่วนๆทำให้ในที่สุดพบว่ามันมีปัญหาที่ ฟังก์ชั่น ob_end_flus()

ว่าด้วยเรื่องอาการที่พบกันก่อน ซึ่งโค้ดเริ่มต้นเป็นแบบนี้
ob_end_flush();
ob_start();
imagepng($im);
$image_string = ob_get_contents();
ob_end_clean();

เรื่องของเรื่องก็คือโค้ดนี้ จะทำการอ่านเนื้อหาของรูปภาพที่สร้างจาก imagepng() ไปเก็บไว้ที่ตัวแปร $image_string และ Server ส่วนใหญ่ก็ไม่มีปัญหาแต่อย่างใด

แต่ Server ที่ผมทดสอบนี้ให้ผลลัพท์เป็นหน้าขาวๆ แทน โดยไม่แสดง Error อะไร และที่สำคัญ โค้ดเดียวกันนี้สามารถใช้ได้ในบางหน้าอีกต่างหาก

อย่างที่ผมเกริ่นไว้ จากการ debug พบว่าปัญหาเกิดจากบรรทัด ob_end_flush()
จากการตรวจสอบต่อ พบว่าปัญหาจะเกิดเขึ้นเมื่อ มีการเรียก ob_end_flush() โดยที่ไม่มีเนื้อหาจะส่ง (เช่นมีการเรียกตอนต้นๆ ของไฟล์) ทำให้มันทำงานผิดพลาด

การแก้ป้ญหา ให้ตรวจสอบก่อนว่ามีเนื้อหาหรือไม่ ถ้ามีถึงจะเรียกใช้ ถ้าไม่มีให้ข้ามไปเลย
if (ob_get_length() > 0) {
  ob_end_flush();
}

ob_start();
imagepng($im);
$image_string = ob_get_contents();
ob_end_clean();
ผู้เขียน goragod โพสต์เมื่อ 15 ก.ย. 2559 เปิดดู 1,903 ป้ายกำกับ ob end flush error
^