บางครั้งที่ทำงานที่ใช้เวลานาน เช่น การเปลี่ยนค่าข้อมูลในตารางทั้งตาราง แต่ php จะแสดงผลลัพธ์ออกมาหลังจากที่มันทำงานเสร็จแล้ว user ก็คิดว่ามัน error ก็เลยปิดไปซะ T_T วิธีที่ใช้ได้คือ การปล่อย flush output ออกมาเป็นระยะโดยเล่นกับพวก function ob_flush เหมือนในที่เคยเขียนไว้ jQuery: Ajax รับข้อมูลแบบ stream แต่กลับไม่ทำงานบน nginx ซะงั้น
วิธีแก้คือใส่
header('X-Accel-Buffering: no');
เพื่อให้ nginx มันส่งข้อมูลที่อมเอาไว้ออกมาซะดีๆ (ถ้าไม่ echo อะไรเลยระหว่างการทำงานเอนจิ้นเอ็ก มันก็ error อยู่ดีเอาใจยากจริงๆ) นี่เป็นตัวอย่าง code ใหม่
<?php header('X-Accel-Buffering: no'); set_time_limit(0); ob_implicit_flush(true); ob_end_flush(); $steps = 100; for ($step = 1; $step <= $steps; $step++) { $time = rand(1, 10); sleep($time); echo '<br>ขั้นตอนที่ ', $step, ' จาก ', $steps, ' ใช้เวลาทำงาน ', $time, ' วินาที'; }
อ่านเพิ่มเติม
About the author