程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP中輸出緩沖

PHP中輸出緩沖

編輯:關於PHP編程


在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()來發送到浏覽器了。

例子


  1. ob_end_clean();
  2. echo str_pad(" ", 256);
  3. for ($i=100; $i>0; $i--) {
  4. echo $i, '
    ';
  5. flush();
  6. sleep(1);
  7. }
  8. ?> 以上代碼應該隔一秒鐘輸出一次$i. 以上echo str_pad(" ", 256)的目的是IE需要接受到256個字節之後才開始顯示。 以上代碼還有以下兩種寫法。
    1. echo str_pad(" ", 256);
    2. for ($i=100; $i>0; $i--) {
    3. echo $i, '
      />';
    4. ob_flush(); //有時候只有flush是不行的
    5. flush();
    6. sleep(1);
    7. }
    8. ?>
      view plain
      1. ob_implicit_flush(true);
      2. echo str_pad(" ", 256);
      3. for ($i=100; $i>0; $i--) {
      4. echo $i, '
        />';
      5. ob_flush();
      6. sleep(1);
      7. }
      8. ?>
        另外我們還需要注意刷新緩沖不光受以上幾方面的影響,還受以下影響:

        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
        
        cache_start(); //在頁面的最開始 
        
        -------頁面輸出
         
        $like="我愛吃橘子香蕉!"; 
        echo $like."
        "; $my_cache->cache_end();//最後進行輸出


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved