PHP中輸出緩沖控制的示例分析

這篇文章主要為大家展示了“PHP中輸出緩沖控制的示例分析”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“PHP中輸出緩沖控制的示例分析”這篇文章吧。

公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。創(chuàng)新互聯(lián)是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來驚喜。創(chuàng)新互聯(lián)推出洛隆免費(fèi)做網(wǎng)站回饋大家。

在 PHP 中,我們直接進(jìn)行 echo 、 或者 print_r 的時(shí)候,輸出的內(nèi)容就會(huì)直接打印出來。但是,在某些情況下,我們并不想直接打印,這個(gè)時(shí)候就可以使用輸出緩沖控制來進(jìn)行輸出打印的控制。當(dāng)然,這一套功能并不僅限出針對打印的內(nèi)容,我們還可以做其它一些操作,這個(gè)我們放到最后再說。

清除輸出

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

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;
ob_end_clean();

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

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

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;
$v = ob_get_contents();
ob_end_clean();

echo $v;

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

ob_start();
php_info();
$v = ob_get_contents();
ob_end_clean();

echo $v;

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

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

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;
flush();
ob_flush();

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

另外,我們還可以使用一個(gè)函數(shù)進(jìn)行自動(dòng)的刷新。

ob_implicit_flush();

ob_start();
echo 111, PHP_EOL;
echo "aaaa", PHP_EOL;

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

一些檢測函數(shù)

ob_start();
ob_start();

echo 123, PHP_EOL;

echo ob_get_length(), PHP_EOL;
// 3

echo ob_get_level(), PHP_EOL;
// 2

print_r(ob_get_status(true));

// Array
// (
//     [0] => Array
//         (
//             [name] => default output handler
//             [type] => 0
//             [flags] => 112
//             [level] => 0
//             [chunk_size] => 0
//             [buffer_size] => 16384
//             [buffer_used] => 0
//         )

//     [1] => Array
//         (
//             [name] => default output handler
//             [type] => 0
//             [flags] => 112
//             [level] => 1
//             [chunk_size] => 0
//             [buffer_size] => 16384
//             [buffer_used] => 17
//         )

// )

ob_get_flush();

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

使用 ob_start() 的回調(diào)函數(shù)來進(jìn)行輸出緩沖區(qū)的內(nèi)容替換

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

ob_start(function($text){
    return (str_replace("apples", "oranges", $text));
});

echo "It's like comparing apples to oranges", PHP_EOL;
ob_get_flush();

// It's like comparing oranges to oranges

最后的輸出結(jié)果就是將 apples 內(nèi)容替換成了 oranges 內(nèi)容。

添加 URL 重寫器

output_add_rewrite_var('var', 'value');
// some links
echo '<a href="file.php">link</a>
<a href="http://example.com">link2</a>';

// <a href="file.php?var=value">link</a>
// <a href="http://example.com">link2</a>

// a form
echo '<form action="script.php" method="post">
<input type="text" name="var2" />
</form>';

// <form action="script.php" method="post">
// <input type="hidden" name="var" value="value" />
// <input type="text" name="var2" />
// </form>

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

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

總結(jié)

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

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

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

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

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

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

  • flush — 刷新輸出緩沖

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

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

  • ob_end_flush — 沖刷出(送出)輸出緩沖區(qū)內(nèi)容并關(guān)閉緩沖

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

  • ob_get_clean — 得到當(dāng)前緩沖區(qū)的內(nèi)容并刪除當(dāng)前輸出緩。

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

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

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

  • ob_get_level — 返回輸出緩沖機(jī)制的嵌套級別

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

  • ob_gzhandler — 在ob_start中使用的用來壓縮輸出緩沖區(qū)中內(nèi)容的回調(diào)函數(shù)。ob_start callback function to gzip output buffer

  • ob_implicit_flush — 打開/關(guān)閉絕對刷送

  • ob_list_handlers — 列出所有使用中的輸出處理程序。

  • ob_start — 打開輸出控制緩沖

  • output_add_rewrite_var — 添加URL重寫器的值(Add URL rewriter values)

  • output_reset_rewrite_vars — 重設(shè)URL重寫器的值(Reset URL rewriter values)

以上是“PHP中輸出緩沖控制的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!

本文題目:PHP中輸出緩沖控制的示例分析
文章位置:http://bm7419.com/article2/gejooc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、定制開發(fā)、網(wǎng)站內(nèi)鏈、微信公眾號、虛擬主機(jī)網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作