首頁  >  文章  >  後端開發  >  深入php ob_start的用法詳解

深入php ob_start的用法詳解

WBOY
WBOY原創
2016-07-25 08:58:491086瀏覽
  1. ob_start(); //開啟緩衝區
  2. echo "Hellon"; //輸出
  3. header("location:indexer("location:index .php"); //把瀏覽器重新導向到index.php
  4. ob_end_flush();//輸出全部內容到瀏覽器
  5. //by bbs.it-home.org
  6. ?>
複製程式碼

所有對header()函數有了解的人都知道,這個函數會傳送一段檔案頭給瀏覽器,但是如果在使用這個函數之前已經有了任何輸出(包括空輸出,例如空格,回車和換行)就會提示出錯。如果我們去掉第一行的ob_start(),再執行此程序,我們會發現得到了一條錯誤提示:"Header had all ready send by"!但加上ob_start,就不會提示出錯,原因是當開啟了緩衝區,echo後面的字元不會輸出到瀏覽器,而是保留在伺服器,直到你使用flush或ob_end_flush才會輸出,所以並不會有任何文件頭輸出的錯誤!

一、 相關函數簡介: 1、Flush:刷新緩衝區的內容,輸出。 函數格式:flush() 說明:這個函數經常使用,效率很高。 2、ob_start :開啟輸出緩衝區 函數格式:void ob_start(void) 說明:當緩衝區啟動時,所有來自PHP程式的非檔案頭資訊均不會傳送,而是保存在內部緩衝區。為了輸出緩衝區的內容,可以使用ob_end_flush()或flush()輸出緩衝區的內容。 3 、ob_get_contents :傳回內部緩衝區的內容。 使用方法:string ob_get_contents(void) 說明:這個函數會傳回目前緩衝區中的內容,如果輸出緩衝區沒有激活,則傳回 FALSE 。 4、ob_get_length:傳回內部緩衝區的長度。 使用方法:int ob_get_length(void) 說明:這個函數會傳回目前緩衝區中的長度;和ob_get_contents一樣,如果輸出緩衝區沒有啟動。則回傳 FALSE。 5、ob_end_flush :傳送內部緩衝區的內容到瀏覽器,並且關閉輸出緩衝區。 使用方法:void ob_end_flush(void) 說明:這個函數會傳送輸出緩衝區的內容(如果有的話)。 6、ob_end_clean:刪除內部緩衝區的內容,並且關閉內部緩衝區 使用方法:void ob_end_clean(void) 說明:這個函數不會輸出內部緩衝區的內容而是刪除它! 7、ob_implicit_flush:開啟或關閉絕對刷新 使用方法:void ob_implicit_flush ([int flag]) 說明:使用過Perl的人都知道$|=x的意義,這個字串可以打開/關閉緩衝區,而ob_implicit_flush函數也和那個一樣,預設為關閉緩衝區,打開絕對輸出後,每個腳本輸出都直接傳送到瀏覽器,不再需要呼叫flush()

二、深入了解:

1. 關於Flush函數: 這個函數在PHP3就出現了,是一個效率很高的函數,他有一個非常有用的功能就是刷新browser的cache.我們舉一個運行效果非常明顯的例子來說明flush. 例子 2.

  1. for($i = 1; $i / / 這句話非常關鍵,cache的結構使得它的內容只有達到一定的大小才能從瀏覽器裡輸出
  2. // 換句話說,如果cache的內容不達到一定的大小,它是不會在程式執行完畢前輸出的。經
  3. // 過測試,我發現這個大小的底限是256個字元長。這表示cache以後接收的內容都會
  4. // 源源不絕的被送出去。
  5. For($j = 1; $j echo $j."
  6. ";
  7. flush(); //這一部會使cache新增的內容被擠出去,顯示到瀏覽器上
  8. sleep(1); //讓程式"睡"一秒鐘,會讓你把效果看得更清楚
  9. }
  10. ?>
複製程式碼

註:如果在程式的首部加入ob_implicit_flush()開啟絕對刷新,就可以在程式中不再使用flush(),這樣做的好處是:提高效率!

2. 關於ob系列函數: 我想先引用我的好朋友y10k的一個例子: 例子 3. 例如你用得到伺服器和客戶端的設定訊息,但是這個資訊會因為客戶端的不同而不同,如果想要保存phpinfo()函數的輸出怎麼辦呢?在沒有緩衝區控制之前,可以說一點辦法也沒有,但是有了緩衝區的控制,我們可以輕鬆的解決:

  1. ob_start(); //開啟緩衝區
  2. phpinfo(); //使用phpinfo函數
  3. $info =ob_get_contents(); //得到緩衝區的內容並且賦值給$info
  4. $file=fopen('info.txt','w'); //開啟檔案info.txt
  5. fwrite($file ,$info); //寫入訊息到info.txt
  6. fclose($file); //關閉檔案info.txt
  7. ?>
複製程式碼

用以上的方法,就可以把不同使用者的phpinfo資訊保存下來,這在以前恐怕沒有辦法辦到!其實上面就是將一些"過程"轉換為"函數"的方法! 或許有人會問:"難道就這個樣子嗎?還有沒有其他用途?"當然有了,比如筆者論壇的PHP 語法加亮顯示就和這個有關(PHP預設的語法加亮顯示函數會直接輸出,不能儲存結果,如果在每次呼叫都顯示恐怕會很浪費CPU,筆者的論壇就把語法加亮函數顯示的結果用控制緩衝區的方法保留了),大家如果感興趣的話可以來看看

可能現在大家對ob_start()的功能有了一定的了解,上面的一個例子看似簡單,但實際上已經掌握了使用ob_start()的要點。 .使用ob_start開啟browser的cache,這樣可以確保cache的內容在你呼叫flush(),ob_end_flush()(或程式執行完畢)之前不會被輸出。 .現在的你應該知道你所擁有的優點:可以在任何輸出內容後面使用header,setcookie以及session,這是ob_start一個很大的特點;也可以使用ob_start的參數,在cache被寫入後,然後自動執行指令,例如ob_start("ob_gzhandler");而我們最常用的做法是用ob_get_contents()得到cache中的內容,然後再處理… .當處理完畢後,我們可以使用各種方法輸出,flush(),ob_end_flush(),以及等到程式執行完畢後的自動輸出。當然,如果你用的是ob_get_contents(),那麼就要你自己控制輸出方式了。

一、 靜態模版技術

簡介:所謂靜態模版技術就是透過某種方式,使得使用者在client端得到的是由PHP產生的html頁面。如果這個html頁面不會再更新,那麼當另外的使用者再次瀏覽此頁面時,程式將不會再呼叫PHP以及相關的資料庫,對於某些資訊量比較大的網站,例如sina,163,sohu。類似這種的技術帶來的好處是非常巨大的。

1 2 下一頁 尾頁



陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn