本篇文章帶大家來了解PHP中的輸出緩衝控制(Output Control) 。有一定的參考價值,有需要的朋友可以參考一下,希望對大家有幫助。
在 PHP 中,我們直接進行 echo 、 或 print_r 的時候,輸出的內容就會直接印出來。但是,在某些情況下,我們並不想直接列印,這個時候就可以使用輸出緩衝控制來進行輸出列印的控制。當然,這套功能並不僅限出針對列印的內容,我們還可以做其它一些操作,這個我們放到最後再說。
首先,我們先來看看看不讓 echo 之類的內容列印輸出。
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; ob_end_clean();
相信有不少小夥伴應該看過 ob_start() 這個函數,它的作用就是開始一段輸出緩衝控制。在 ob_start() 之後的程式碼中的輸出語句都會進入輸出緩衝區,這個時候,如果我們呼叫了 ob_end_clean() 、 ob_clean() 或 ob_get_clean() ,則不會有任何輸出了。它們三個的作用都是清除輸出緩衝區的內容。具體的差異大家可以參考文章最後給出的函數說明或官方文件。
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; $v = ob_get_contents(); ob_end_clean(); echo $v;
上面說過,使用了ob_end_clean() 就會清除輸出緩衝區裡面的內容,但是在這段程式碼中,我們使用ob_get_contents() 函數直接將緩衝區的內容賦值給了變數\v 中就有了前面兩段echo 中的內容,也就是說,這個一套操作我們就拿到了本身應該輸出的內容,並將它保存在變數中了。這樣做有什麼用呢?我們可以獲得類似於 phpinfo() 、 var_dump() 這些直接輸出函數的內容了,並且不會印在客戶端螢幕上。例如:
ob_start(); php_info(); $v = ob_get_contents(); ob_end_clean(); echo $v;在 $v 中的內容就是 php_info() 的內容了。這就是輸出緩衝控制的第二個能力。
ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL; flush(); ob_flush();
ob_implicit_flush(); ob_start(); echo 111, PHP_EOL; echo "aaaa", PHP_EOL;使用 ob_implicit_flush() 之後,我們就不需要手動地呼叫 ob_flush() 之類的函數來刷新緩衝區內容了。
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_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最後的輸出結果就是將 apples 內容替換成了 oranges 內容。
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>
关于输出缓冲控制这块还有很多好玩的东西,不过限于篇幅我们先介绍到这里,将来踫到什么好的功能的应用我们再单独讲解。现在基于 Swoole 的应用越来越多,当我们需要将 TP 、 Laravel 这类传统框架转换成支持 Swoole 的时候,往往就需要在入口文件使用输出缓冲控制来进行修改。因为传统框架基本都是直接进行 echo 之类的输出的,而在 Swoole 中,echo 这类的内容是直接打印在控制台的,这就需要我们通过 ob_get_contents() 能力获得全部的输出再通过 response->end() 来进行实际的响应。另外,还有一些其他的场景也会用到输出缓冲控制:
最后,再给出输出缓冲控制相关的函数说明,具体内容大家还是要多看官方文档的介绍。
测试代码: https://github.com/zhangyue0503/dev-blog/blob/master/php/202005/source/%E8%BF%98%E6%90%9E%E4%B8%8D%E6%87%82PHP%E4%B8%AD%E7%9A%84%E8%BE%93%E5%87%BA%E7%BC%93%E5%86%B2%E6%8E%A7%E5%88%B6%EF%BC%9F.php
推荐学习:《PHP视频教程》
以上是詳解PHP中的輸出緩衝控制(Output Control)的詳細內容。更多資訊請關注PHP中文網其他相關文章!