強迫 PHP 將 Buffer 的資料提前輸出

網頁上的 PHP 的程式通常是 全部執行完成後, 才會一起將資料於螢幕上呈現出來.

但是若程式要跑很久, 想要跑完一小段, 就先將那一小段的資料(Buffer)秀出來呢?

強迫 PHP 將 Buffer 的資料提前秀出

想達成上述的需求, 可以使用這個 PHP: flush

此文件有下述說明:

flush() may not be able to override the buffering scheme of your web server and it has no effect on any client-side buffering in the browser. It also doesn't affect PHP's userspace output buffering mechanism. This means you will have to call both ob_flush() and flush() to flush the ob output buffers if you are using those.

簡單講, 就是若要達成上述的需求, 需要 flush() + ob_flush() 搭配.

測試程式如下:

<?php
header('Content-type: text/html; charset=utf-8');
$t = 0;
$time = time() + 300;
while (time() < $time) {
    if ($t < time()) {
        echo 'a';
        ob_flush();
        flush();
    }
    $t = time();
}
?>

此程式看到 'a' 會一直印出來. 若將 ob_flush(), flush() 拿掉, 會等整個程式執行完後, 才會於頁面秀出來.

再看下面的範例:

<?php
header('Content-type: text/html; charset=utf-8');
for ($i = 0; $i < 10; $i++) {
    echo $i . '<br>';
    flush();
    ob_flush();
    sleep(1);
}
?>

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

在〈強迫 PHP 將 Buffer 的資料提前輸出〉中有 6 則留言

  1. 我在網上找了幾篇類次的代碼嘗試,但都是失敗....
    你寫的我都有試,一樣是執行完後才秀出來
    有沒有其他地方要注意?

  2. 你好,我想请问一下在本地测试时ok的,但是放到服务器上就不行,请问有什么需要注意的地方吗?

  3. 請問, php中foreach得出的每個陣列能同時往下執行嗎?
    目前foreach總是一個一個陣列帶入執行,花費不少時間, 謝謝您.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料