php ob緩存介紹以及ob函數詳解

伊谢尔伦
發布: 2023-03-07 21:36:01
原創
5934 人瀏覽過

ob快取介紹

ob是output buffering的簡稱,輸出緩衝區,緩衝區是透過php.ini中的output_buffering變數控制的。其預設值是off,可以設定為on來開啟buffer。打來buffer後,即便程式中沒有用ob函數,實際上程式碼也是使用了緩衝區的。另外,不管php.ini中output_buffering的設置,cli模式的php始終預設是關閉的。為什麼要是緩衝區呢?簡單來說,高速的cpu提早處理完自己的數據,想透過線路傳遞給用戶,但線路太窄了,一下輸送不過去。如果引入緩衝區,cpu可以將快速將產生的資料放入緩衝區,然後自己哪裡涼快兒哪裡就待著這歇著去了。緩衝區根據指令適時將資料輸出。這個樣就合理解決了高速cpu與低速I/O設備的矛盾了。

ob的基本原則:如果ob快取打開,則echo的資料首先放在ob快取。如果是header訊息,直接放在程式快取。當頁面執行到最後,會把ob快取的資料放到程式緩存,然後依序回傳給瀏覽器。

ob的基本功能

  1)防止在瀏覽器有輸出之後再使用setcookie()、header()或session_start()等傳送頭檔的函數造成的錯誤。其實這樣的用法少用為好,養成良好的程式碼習慣。
  2)捕捉對一些不可取得的函數的輸出,例如phpinfo()會輸出一大堆的HTML,但是我們無法用一個變數例如$info=phpinfo();來捕捉,這時候ob就管用了。
  3)將輸出的內容處理,例如進行gzip壓縮,例如進行簡繁轉換,例如進行一些字串替換。
  4)產生靜態文件,其實就是捕捉整頁的輸出,然後儲存成文件。經常在產生HTML,或整頁快取中使用。

ob相關函數詳解

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()

關於flush函數實例程式碼如下:

<?php
for($i = 1; $i <= 300; $i++ ) print(" ");
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的。经
// 过测试,发现这个大小的底限是256个字符长。这意味着cache以后接收的内容都会源源不断的被发送出去。
For($j = 1; $j <= 20; $j++) {
echo $j."";
flush(); //这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚
}
?>
登入後複製

說明:flush()是一個效率很高的函數,它非常有用的功能就是刷新browsercache.

關於ob系列函數的實例代碼:

例如你用得到伺服器和客戶端的設定訊息,但是這個訊息會因為客戶端的不同而不同,如果想要保存phpinfo()函數的輸出呢?在沒有緩衝區控制之前,可以說一點辦法也沒有,但是有了緩衝區的控制,我們可以輕鬆的解決。

<?php
ob_start(); //打开缓冲区
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\&#39;info.txt\&#39;,\&#39;w\&#39;); //打开文件info.txt
fwrite($file,$info); //写入信息到info.txt
fclose($file); //关闭文件info.txt
?>
登入後複製

用以上的方法,就可以把不同使用者的phpinfo資訊保存下來,這在以前恐怕沒有辦法辦到!其實上面就是將一些"過程"轉換為"函數"的方法!

關於靜態模版輸出實例程式碼:

<?php
ob_start();//打开缓冲区
//php页面的全部输出
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("output00001.html", "w"); //创建一个文件,并打开,准备写入
fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……
fclose($fp);
?>
登入後複製

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

【相關教學推薦】

1. 《php.cn獨孤九賤(4)-php影片教學

2.   php程式設計從入門到精通全套教學

以上是php ob緩存介紹以及ob函數詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!