【Php】一個在頁面緩緩輸出效果的例子

/**
 * Author:RDP
 * My mail:[email protected]
 * My blog: blog.teamhaka.com/

*/


類似於一些開源系統在安裝時,會在頁面無刷新的輸出實時安裝狀態一樣的效果。
實際上是利用不等系統緩存達到一定字節就把已輸出的內容交給客戶端的原理。(一般爲了輸出效率,系統會在輸出內容積累到一定容量時,再一齊交付給客戶端的)

下例在linux服務器和windows服務器上、以及ff5.0和ie8上測試通過無問題

$text = <<< EOM
《送別》

長亭外
古道邊
芳草碧連天
晚風拂柳笛聲殘
夕陽山外山
天之涯
地之角
知交半零落
一壺濁酒盡餘歡
今宵別夢寒
EOM;

header( 'Content-Type: text/html;charset=utf-8' );//header必須! 有些瀏覽器可能會在接收html標記的開頭之前緩存內容  比如對FF5.0就是如此

$space = str_repeat(" ",4096);//輸出4096個空格
//1 一些版本的 Microsoft Internet Explorer 只有當接受到的256個字節以後纔開始顯示該頁面,所以必須發送一些額外的空格來讓這些瀏覽器顯示頁面內容。
//2 一些Web服務器的output_buffering默認是4069字符或者更大,即輸出內容必須達到4069字符服務器纔會flush刷新輸出緩衝,爲了確保flush有效,最好在ob_flush()函數前有此填充處理

$textArray = explode("\n",$text);

foreach($textArray as $contents){
	echo $contents.'';
	if(connection_aborted() ){
		/* 檢查客戶端是否已經斷開 */
		exit;
	}
 	echo $space;//填充
	ob_flush();//開啓緩存的情況下,腳本輸出的內容存入了輸出緩存中 ,這時沒有處於等待輸出狀態的內容,你直接使用flush()不會向客戶端發出任何內容。而 ob_flush()的作用就是將本來存在於輸出緩存中的內容取出來,設置爲等待輸出狀態,但不會直接發送到客戶端 ,這時你就需要先使用 ob_flush()再使用flush(),客戶端才能立即獲得腳本的輸出
	flush();//刷新PHP程序的緩衝  將當前爲止程序的所有輸出發送到用戶的瀏覽器
	sleep(1);
}

echo 'ok';


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章