PHP中的輸出緩沖控制詳解_第1頁
PHP中的輸出緩沖控制詳解_第2頁
PHP中的輸出緩沖控制詳解_第3頁
PHP中的輸出緩沖控制詳解_第4頁
PHP中的輸出緩沖控制詳解_第5頁
已閱讀5頁,還剩3頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第PHP中的輸出緩沖控制詳解目錄清除輸出

獲得輸出緩沖區(qū)的內容刷新(輸出)緩沖區(qū)內容一些檢測函數(shù)使用ob_start()的回調函數(shù)來進行輸出緩沖區(qū)的內容替換

添加URL重寫器總結

測試代碼:在PHP中,我們直接進行echo、或者print_r的時候,輸出的內容就會直接打印出來。但是,在某些情況下,我們并不想直接打印,這個時候就可以使用輸出緩沖控制來進行輸出打印的控制。當然,這一套功能并不僅限出針對打印的內容,我們還可以做其它一些操作,這個我們放到最后再說。

清除輸出

首先,我們先來看看不讓echo之類的內容打印輸出。

ob_start();

echo111,PHP_EOL;

echo"aaaa",PHP_EOL;

ob_end_clean();

相信有不少小伙伴應該見過ob_start()這個函數(shù),它的作用就是開始一段輸出緩沖控制。在ob_start()之后的代碼中的輸出語句都會進入輸出緩沖區(qū),這個時候,如果我們調用了ob_end_clean()、ob_clean()或者ob_get_clean(),則不會有任何輸出了。它們三個的作用都是清除輸出緩沖區(qū)的內容。具體的區(qū)別大家可以參考文章最后給出的函數(shù)說明或者官方文檔。

獲得輸出緩沖區(qū)的內容

ob_start();

echo111,PHP_EOL;

echo"aaaa",PHP_EOL;

$v=ob_get_contents();

ob_end_clean();

echo$v;

上面說過,使用了ob_end_clean()就會清除輸出緩沖區(qū)里面的內容,但是在這段代碼中,我們使用ob_get_contents()函數(shù)直接將緩沖區(qū)的內容賦值給了變量\v。這時候,v。這時候,v中就有了前面兩段echo中的內容,也就是說,這個一套操作我們就拿到了本身應該輸出的內容,并將它保存在了變量中。這樣做有什么用呢?我們可以獲得類似于phpinfo()、var_dump()這些直接輸出函數(shù)的內容了,并且不會打印在客戶端屏幕上。比如:

ob_start();

php_info();

$v=ob_get_contents();

ob_end_clean();

echo$v;

在$v中的內容就是php_info()的內容了。這就是輸出緩沖控制的第二個能力。

刷新(輸出)緩沖區(qū)內容

ob_start();

echo111,PHP_EOL;

echo"aaaa",PHP_EOL;

flush();

ob_flush();

類似的,我們在緩沖區(qū)中想要再次直接輸出內容,使用flush()、ob_flush()、ob_end_flush()及ob_get_flush()就可以了,其實就是相當于讓ob_start()之后的echo這類輸出語句重新生效并正常輸出。

另外,我們還可以使用一個函數(shù)進行自動的刷新。

ob_implicit_flush();

ob_start();

echo111,PHP_EOL;

echo"aaaa",PHP_EOL;

使用ob_implicit_flush()之后,我們就不需要手動地調用ob_flush()之類的函數(shù)來刷新緩沖區(qū)內容了。

一些檢測函數(shù)

ob_start();

ob_start();

echo123,PHP_EOL;

echoob_get_length(),PHP_EOL;

echoob_get_level(),PHP_EOL;

print_r(ob_get_status(true));

//Array

//[0]=Array

//[name]=defaultoutputhandler

//[type]=0

//[flags]=112

//[level]=0

//[chunk_size]=0

//[buffer_size]=16384

//[buffer_used]=0

//[1]=Array

//[name]=defaultoutputhandler

//[type]=0

//[flags]=112

//[level]=1

//[chunk_size]=0

//[buffer_size]=16384

//[buffer_used]=17

ob_get_flush();

ob_get_length()會返回當前緩沖區(qū)里面內容的長度,這里我們只打印了一個123,在緩沖區(qū)中保存了3個字符,所以輸出的正是3。ob_get_level()返回的是當前緩沖區(qū)的層級,請注意,我們在上面調用了兩次ob_start(),也就是有兩層的緩沖區(qū),這個緩沖區(qū)是可以嵌套的。ob_get_status()函數(shù)是緩沖區(qū)的狀態(tài)信息,字段的說明可以查看官方文檔,這里不再贅述。

使用ob_start()的回調函數(shù)來進行輸出緩沖區(qū)的內容替換

這是一個例子,但是可以推廣到其他很功能,比如我們可以用來進行全局的輸出過濾、可以做CSS或JS文件的壓縮優(yōu)化等等。

ob_start(function($text){

return(str_replace("apples","oranges",$text));

echo"It'slikecomparingapplestooranges",PHP_EOL;

ob_get_flush();

//It'slikecomparingorangestooranges

最后的輸出結果就是將apples內容替換成了oranges內容。

添加URL重寫器

output_add_rewrite_var('var','value');

//somelinks

echo'ahref="file.php"rel="externalnofollow"link/a

ahref=""rel="externalnofollow"rel="externalnofollow"link2/a

//ahref="file.phpvar=value"rel="externalnofollow"link/a

//ahref=""rel="externalnofollow"rel="externalnofollow"link2/a

//aform

echo'formaction="script.php"method="post"

inputtype="text"name="var2"/

/form

//formaction="script.php"method="post"

//inputtype="hidden"name="var"value="value"/

//inputtype="text"name="var2"/

///form

上面的代碼看出什么端倪了嘛?沒錯,使用output_add_rewrite_var()函數(shù),我們可以在PHP輸出的時候為HTML的鏈接或者表單代碼增加一個參數(shù)。有沒有想到什么使用場景?POST表單的CSRF攻擊的防范。

這個函數(shù)會根據(jù)php.ini文件中的url_rewriter.tags配置項來進行添加,在默認情況下這個配置項只支持from表單,同時,它還可以支持a標簽的href、area標簽的href、frame標簽的src、input標簽的src等等。也就是說,會在這些標簽相對應的屬性中自動添加字段。當然,它也有一個反函數(shù)output_reset_rewrite_vars()用于取消之前增加的這個參數(shù)。

總結

關于輸出緩沖控制這塊還有很多好玩的東西,不過限于篇幅我們先介紹到這里,將來踫到什么好的功能的應用我們再單獨講解?,F(xiàn)在基于Swoole的應用越來越多,當我們需要將TP、Laravel這類傳統(tǒng)框架轉換成支持Swoole的時候,往往就需要在入口文件使用輸出緩沖控制來進行修改。因為傳統(tǒng)框架基本都是直接進行echo之類的輸出的,而在Swoole中,echo這類的內容是直接打印在控制臺的,這就需要我們通過ob_get_contents()能力獲得全部的輸出再通過response-end()來進行實際的響應。另外,還有一些其他的場景也會用到輸出緩沖控制:

1.在PHP中,像header(),session_start(),setcookie()等這樣的發(fā)送頭文件的函數(shù)前,不能有任何的輸出,而利用輸出緩沖控制函數(shù)可以在這些函數(shù)前進行輸出而不報錯

2.對輸出的內容進行處理,例如生成靜態(tài)緩存文件、進行gzip壓縮輸出,這算是較常用的功能了

3.捕獲一些不可獲取的函數(shù)輸出,例如phpinfo(),var_dump()等等,這些函數(shù)都會將運算結果顯示在瀏覽器中,而如果我們想對這些結果進行處理,則用輸出緩沖控制函數(shù)是個不錯的方法。說的通俗點,就是這類函數(shù)都不會有返回值,而要獲取這些函數(shù)的輸出數(shù)據(jù),就要用到輸出緩沖控制函數(shù)

4.對一些數(shù)據(jù)進行實時的輸出

最后,再給出輸出緩沖控制相關的函數(shù)說明,具體內容大家還是要多看官方文檔的介紹。

flush—刷新輸出緩沖

ob_clean—清空(擦掉)輸出緩沖區(qū)

ob_end_clean—清空(擦除)緩沖區(qū)并關閉輸出緩沖

ob_end_flush—沖刷出(送出)輸出緩沖區(qū)內容并關閉緩沖

ob_flush—沖刷出(送出)輸出緩沖區(qū)中的內容

ob_get_clean—得到當前緩沖區(qū)的內容并刪除當前輸出緩。

ob_get_contents—返回輸出緩沖區(qū)的內容

ob_get_flush—刷出(送出)緩沖區(qū)內容,以字符串形式返回內容,并關閉輸出緩沖區(qū)。

ob_get_length—返回輸出緩沖區(qū)內容的長度

ob_get_level—返回輸出緩沖機制的嵌套級別

ob_get_status—得到所有輸出緩沖區(qū)的狀態(tài)

ob_gzhandler—在ob_start中使用的用來壓縮輸出緩沖區(qū)中內容的回調函數(shù)。ob_startcallbackfunctiontogzipo

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論