在PHP中,當執行echo,print的時候,輸出並沒有立即通過tcp傳給用戶端瀏覽器顯示, 而是將資料寫入php buffer。php output_buffering機制,意味在tcp buffer之前,建立了一新的隊列,資料必須經過該隊列。當一個php buffer寫滿的時候,指令碼進程會將php buffer中的輸出資料交給系統核心交由tcp傳給瀏覽器顯示。所以,資料會依次寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser
在PHP中與重新整理緩衝相關的函數有三個:
1). flush
重新整理PHP程式的緩衝,而不論PHP執行在何種情況下。該函數將當前為止程式的所有輸出發送到使用者的瀏覽器。 但是該函數不會對伺服器或用戶端瀏覽器的緩衝模式產生任何影響,也不會對PHP本身的緩衝產生任何影響。
2).ob_flush
該函數對PHP本身的的緩衝進行輸出。PHP本身的緩衝受php.ini中的output_buffering的控制。ob_flush()的作用就是將本來存在輸出緩衝中的內容取出來,設定為等待輸出狀態,但不會直接發送到用戶端,這時你就需要先使用ob_flush()再使用flush(),用戶端才能立即獲得指令碼的輸出。
與PHP本身輸出緩衝相關的兩個PHP配置是:
參數1:output_buffering :on/off 或 者整數 。設定為on時,將在所有指令碼中使用輸出緩衝控制,不限制緩衝的大小。而設定為整數時,如output_buffering=4096,當緩衝數 據達到4096位元組時會自動輸出重新整理緩衝。而這個參數的不同正是導致以上代碼在不同時候執行結果不同的原因。當output_buffering關閉時, 指令碼所有的輸出(echo)都會即時發送到用戶端,執行上面代碼時就是每秒輸出一個數字。而開啟output_buffering後,輸出內容就會先緩衝 在服務端,直到指令碼結束時才一起發送給用戶端。
參數2:implicit_flush:on/off。設定ON意味著,當指令碼有輸出時,自動立即發送到用戶端。相當於在echo後自動加flush()。
3).ob_implicit_flush
這個函數強制每當有輸出的時候,即刻把輸出發送到瀏覽器。這樣就不需要每次輸出(echo)後,都用flush()來發送到瀏覽器了。
例子
-
- ob_end_clean();
- echo str_pad(" ", 256);
- for ($i=100; $i>0; $i--) {
- echo $i, '
';
- flush();
- sleep(1);
- }
- ?> 以上代碼應該隔一秒鐘輸出一次$i. 以上echo str_pad(" ", 256)的目的是IE需要接受到256個位元組之後才開始顯示。 以上代碼還有以下兩種寫法。
-
- echo str_pad(" ", 256);
- for ($i=100; $i>0; $i--) {
- echo $i, '
/>';
- ob_flush(); //有時候只有flush是不行的
- flush();
- sleep(1);
- }
- ?>
view plain
-
- ob_implicit_flush(true);
- echo str_pad(" ", 256);
- for ($i=100; $i>0; $i--) {
- echo $i, '
/>';
- ob_flush();
- sleep(1);
- }
- ?>
另外我們還需要注意重新整理緩衝不光受以上幾方面的影響,還受以下影響:1). 個別web伺服器程式,特別是Win32下的web伺服器程式,在發送結果到瀏覽器之前,仍然會緩衝指令碼的輸出,直到程式結束為止。有些Apache的模組,比如mod_gzip,可能自己進行輸出緩衝,這將導致flush()函 數產生的結果不會立即被發送到用戶端瀏覽器。甚至瀏覽器也會在顯示之前,緩衝接收到的內容。例如 Netscape 瀏覽器會在接受到換行或 html 標記的開頭之前緩衝內容,並且在接受到 標記之前,不會顯示出整個表格。一些版本的 Microsoft Internet Explorer 只有當接受到的256個位元組以後才開始顯示該頁面,所以必鬚髮送一些額外的空格來讓這些瀏覽器顯示頁面內容。
下面是很簡單的一段代碼
cache_file=$cache_file;$this->cache_time=$cache_time;}//緩衝開始function cache_start(){if ($this->cache_active){include($this->cache_file);exit;}//開啟緩衝ob_start();}//判斷快取檔案是否存在並且可用function cache_active(){//判斷檔案是否存在if(file_exists($this->cache_file)){$last_time=@filemtime($this->cache_file);//擷取最後修改時間//判斷時間是否可用if($this->cache_time<$last_time){//可用,包含進來直接顯示return true;}else{//刪除該緩衝,重建立立緩衝unlink($this->cache_file);return false;}}}//進行緩衝目錄的產生function cache_creat(){//不用判斷直接產生快取檔案目錄及檔案,迴圈組建檔案$file=explode("/", $this->cache_file);$num=count($file)-1;for ($i=0;$i<$num;$i++){$tm.=$file[$i]."/";if (!file_exists($tm)){mkdir($tm);}}}//緩衝的輸出function cache_end(){$cache_content=ob_get_contents();$this->cache_creat();$fp=@fopen($this->cache_file, "w+");fwrite($fp, $cache_content);ob_end_flush();}//緩衝的清除function cache_clean(){if(unlink($this->cache_file)){return true;}else {$this->alert("緩衝刪除失敗!請檢查快取檔案是否存在");return false;}}//定義快取檔案的提醒函數function alert($a){echo "";}}?>測試頁面test.phpcache_start(); //在頁面的最開始 -------頁面輸出 $like="我愛吃橘子香蕉!"; echo $like."
";$my_cache->cache_end();//最後進行輸出
http://www.bkjia.com/PHPjc/777562.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/777562.htmlTechArticle在PHP中,當執行echo,print的時候,輸出並沒有立即通過tcp傳給用戶端瀏覽器顯示, 而是將資料寫入php buffer。php output_buffering機制,意味在tcp...
-