Tag Archive flush

Byphunsanit

NGINX: แสดงผลลัพธ์ทันที

บางครั้งที่ทำงานที่ใช้เวลานาน เช่น การเปลี่ยนค่าข้อมูลในตารางทั้งตาราง แต่ 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, ' วินาที';
}

อ่านเพิ่มเติม