而是6秒後全部輸出
回複內容:
而是6秒後全部輸出
正常情況下,PHP指令碼執行完畢後才會把所有結果返回給瀏覽器,如果你想提前返回,則需要手動flush推送,比如:
BubbleSort.php'.str_repeat(' ', 1024*4); ob_flush(); flush(); sleep(1);}echo 'Done.';ob_end_flush();?>每隔1秒顯示1行:Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 [9] => 9 )Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 [9] => 0 )Array ( [0] => 2 [1] => 3 [2] => 4 [3] => 5 [4] => 6 [5] => 7 [6] => 8 [7] => 9 [8] => 1 [9] => 0 )Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 6 [4] => 7 [5] => 8 [6] => 9 [7] => 2 [8] => 1 [9] => 0 )Array ( [0] => 4 [1] => 5 [2] => 6 [3] => 7 [4] => 8 [5] => 9 [6] => 3 [7] => 2 [8] => 1 [9] => 0 )Array ( [0] => 5 [1] => 6 [2] => 7 [3] => 8 [4] => 9 [5] => 4 [6] => 3 [7] => 2 [8] => 1 [9] => 0 )Array ( [0] => 6 [1] => 7 [2] => 8 [3] => 9 [4] => 5 [5] => 4 [6] => 3 [7] => 2 [8] => 1 [9] => 0 )Array ( [0] => 7 [1] => 8 [2] => 9 [3] => 6 [4] => 5 [5] => 4 [6] => 3 [7] => 2 [8] => 1 [9] => 0 )Array ( [0] => 8 [1] => 9 [2] => 7 [3] => 6 [4] => 5 [5] => 4 [6] => 3 [7] => 2 [8] => 1 [9] => 0 )Array ( [0] => 9 [1] => 8 [2] => 7 [3] => 6 [4] => 5 [5] => 4 [6] => 3 [7] => 2 [8] => 1 [9] => 0 )Done.
PHP_CLI_Server能夠即時輸出.Apache和Nginx的gzip可能會進行輸出緩衝,這將導致flush()函數產生的結果不會立即被發送到用戶端瀏覽器.
在Nginx+PHP-FPM下還要注意Nginx的fastcgi buffer,比如:
fastcgi_buffer_size 128k;
fastcgi_buffers 8 128k;
表示Nginx會緩衝PHP-FPM輸出的資訊,當達到128k時才會將緩衝區的資料發送給用戶端,那麼我們首先需要將這個緩衝區調小:
fastcgi_buffer_size 4k;
fastcgi_buffers 8 4k;
並且,必須禁用gzip:
gzip off;
然後,在php中,在ob_flush和flush前,輸出一段達到4k的內容,例如:
echo str_repeat(' ', 1024*4);
到此,PHP就可以正常通過ob_flush和flush逐行輸出需要的內容了.
樓上正解,但你也看到緩衝這類瀏覽器安全色性問題很多。
既然慢慢輸出不如選用js,隔1秒從後台擷取一次訊息。