บางครั้งที่ทำงานที่ใช้เวลานาน เช่น การเปลี่ยนค่าข้อมูลในตารางทั้งตาราง แต่ php จะแสดงผลลัพธ์ออกมาหลังจากที่มันทำงานเสร็จแล้ว user ก็คิดว่ามัน error ก็เลยปิดไปซะ T_T วิธีที่ใช้ได้คือ การปล่อย flush output ออกมาเป็นระยะโดยเล่นกับพวก function ob_flush เหมือนในที่เคยเขียนไว้ jQuery: Ajax รับข้อมูลแบบ stream แต่กลับไม่ทำงานบน nginx ซะงั้น
วิธีแก้คือใส่
1 | header( 'X-Accel-Buffering: no' ); |
เพื่อให้ nginx มันส่งข้อมูลที่อมเอาไว้ออกมาซะดีๆ (ถ้าไม่ echo อะไรเลยระหว่างการทำงานเอนจิ้นเอ็ก มันก็ error อยู่ดีเอาใจยากจริงๆ) นี่เป็นตัวอย่าง code ใหม่
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?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