PHP中輸出緩衝

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   os   io   strong   


在PHP中,當運行echo,print的時候,輸出並沒有馬上通過tcp傳給client瀏覽器顯示, 而是將資料寫入php buffer。php output_buffering機制,意味在tcp buffer之前,建立了一新的隊列,資料必須經過該隊列。當一個php buffer寫滿的時候,指令碼進程會將php buffer中的輸出資料交給系統核心交由tcp傳給瀏覽器顯示。所以,資料會依次寫到這幾個地方echo/pring -> php buffer -> tcp buffer -> browser


在PHP中與重新整理緩衝相關的函數有三個:

1). flush
重新整理PHP程式的緩衝,而不論PHP運行在何種情況下。該函數將當前為止程式的全部輸出發送到使用者的瀏覽器。 可是該函數不會對server或client瀏覽器的緩衝模式產生不論什麼影響,也不會對PHP本身的緩衝產生不論什麼影響。

2).ob_flush

該函數對PHP本身的的緩衝進行輸出。PHP本身的緩衝受php.ini中的output_buffering的控制。ob_flush()的作用就是將本來存在輸出緩衝中的內容取出來,設定為等待輸出狀態,但不會直接發送到client,這時你就須要先使用ob_flush()再使用flush(),client才幹馬上獲得指令碼的輸出。

    與PHP本身輸出緩衝相關的兩個PHP配置是:
      參數1:output_buffering :on/off 或 者整數 。設定為on時,將在全部指令碼中使用輸出緩衝控制,不限制緩衝的大小。而設定為整數時,如output_buffering=4096,當緩衝數 據達到4096位元組時會自己主動輸出重新整理緩衝。而這個參數的不同正是導致以上代碼在不同一時候候運行結果不同的原因。當output_buffering關閉時, 指令碼全部的輸出(echo)都會即時發送到client,運行上面代碼時就是每秒輸出一個數字。而開啟output_buffering後,輸出內容就會先緩衝 在服務端,直到指令碼結束時才一起發送給client。
     參數2:implicit_flush:on/off。設定ON意味著,當指令碼有輸出時,自己主動馬上發送到client。相當於在echo後自己主動加flush()。


3).ob_implicit_flush

這個函數強制每當有輸出的時候,即刻把輸出發送到瀏覽器。這樣就不須要每次輸出(echo)後,都用flush()來發送到瀏覽器了。

範例


  1. <?php  
  2. ob_end_clean();  
  3. echo str_pad(" ", 256);  
  4. for ($i=100; $i>0; $i--) {  
  5.    echo $i, ‘<br/>‘;  
  6.    flush();  
  7.    sleep(1);   
  8. }   
  9. ?>  
以上代碼應該隔一秒鐘輸出一次$i.  以上echo str_pad(" ", 256)的目的是IE須要接受到256個位元組之後才開始顯示。 以上代碼還有下面兩種寫法。
  1. <?php  
  2. echo str_pad(" ", 256);  
  3. for ($i=100; $i>0; $i--) {  
  4.    echo $i, ‘<br />‘;  
  5.    ob_flush(); //有時候僅僅有flush是不行的 
  6.    flush();  
  7.    sleep(1);   
  8. }   
  9. ?>  

view plain
  1. <?php  
  2. ob_implicit_flush(true);  
  3. echo str_pad(" ", 256);  
  4. for ($i=100; $i>0; $i--) {  
  5.    echo $i, ‘<br />‘;  
  6.    ob_flush();  
  7.    sleep(1);   
  8. }   
  9. ?>  

另外我們還須要注意重新整理緩衝不光受以上幾方面的影響,還受下面影響:

1). 個別webserver程式,特別是Win32下的webserver程式,在發送結果到瀏覽器之前,仍然會緩衝指令碼的輸出,直到程式結束為止。有些Apache的模組,比方mod_gzip,可能自己進行輸出緩衝,這將導致flush()函 數產生的結果不會馬上被發送到client瀏覽器。甚至瀏覽器也會在顯示之前,緩衝接收到的內容。比如 Netscape 瀏覽器會在接受到換行或 html 標記的開頭之前緩衝內容,而且在接受到 </table> 標記之前,不會顯示出整個表格。一些版本號碼的 Microsoft Internet Explorer 僅僅有當接受到的256個位元組以後才開始顯示該頁面,所以必鬚髮送一些額外的空格來讓這些瀏覽器顯示頁面內容。


以下是非常easy的一段代碼



<?php/*--------------------編寫自己的緩衝類---------------*/class my_cache{//定義有關變數private $cache_time;//緩衝有效時間private  $cache_file;//快取檔案儲存路徑//初始化類,預設是index.html時間是1function __construct($cache_file='index.html',$cache_time="1"){$this->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)){[email protected]($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();[email protected]($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."<br>";$my_cache->cache_end();//最後進行輸出


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.