在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(),客戶端才能立即獲得腳本的輸出。
3).ob_implicit_flush
這個函數強制每當有輸出的時候,即刻把輸出發送到浏覽器。這樣就不需要每次輸出(echo)後,都用flush()來發送到浏覽器了。
例子
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 "<script>alert('$a');</script>"; } } ?> 測試頁面test.php include 'cache_my_class.php'; $my_cache=new my_cache("./chunge/ge/hao/index.html",5); $my_cache->cache_start(); //在頁面的最開始 -------頁面輸出 $like="我愛吃橘子香蕉!"; echo $like."
"; $my_cache->cache_end();//最後進行輸出