在PHP中,当我们直接执行echo或print_r时,会直接打印输出内容。但是,在某些情况下,我们不想直接打印。这时候我们就可以使用outputbuffercontrol来控制输出打印。当然,这套功能不仅仅局限于打印内容,我们还可以做其他的操作,这个我们最后再说。清除输出首先,让我们看一下从打印输出中保留回声之类的东西。ob_start();echo111,PHP_EOL;echo"aaaa",PHP_EOL;ob_end_clean();相信很多朋友应该都看过ob_start()这个函数,它的作用就是开始一段输出缓冲控制。ob_start()之后代码中的输出语句都会进入输出缓冲区。这时,如果我们调用ob_end_clean()、ob_clean()或ob_get_clean(),将没有输出。它们三个的作用都是清空输出缓冲区的内容。具体区别可以参考文末给出的功能说明或官方文档。获取输出缓冲区的内容ob_start();echo111,PHP_EOL;echo"aaaa",PHP_EOL;$v=ob_get_contents();ob_end_clean();echo$v;上面提到,使用ob_end_clean()会清除输出缓冲区的内容,但是在这段代码中,我们使用ob_get_contents()函数直接将缓冲区的内容赋值给变量\$v。这个时候$v里面就包含了前面两段echo的内容,也就是说我们已经得到了这组操作应该由自己输出的内容,并保存在一个变量中。这样做有什么用?我们可以得到phpinfo()、var_dump()等直接输出函数的内容,不会打印到客户端屏幕上。例如:ob_start();php_info();$v=ob_get_contents();ob_end_clean();echo$v;$v中的内容是php_info()的内容。这是输出缓冲区控件的第二个功能。刷新(输出)缓冲区内容ob_start();echo111,PHP_EOL;echo"aaaa",PHP_EOL;flush();ob_flush();同样,我们想直接再次输出缓冲区中的内容,使用flush(),ob_flush()、ob_end_flush()和ob_get_flush()就够了,其实相当于让ob_start()重新生效后的echo等输出语句正常输出。另外,我们还可以使用一个函数来自动刷新。ob_implicit_flush();ob_start();回显111,PHP_EOL;echo"aaaa",PHP_EOL;使用ob_implicit_flush()后,我们就不需要手动调用ob_flush()等函数来刷新缓冲区内容了。一些检测函数ob_start();ob_start();echo123,PHP_EOL;echoob_get_length(),PHP_EOL;//3echoob_get_level(),PHP_EOL;//2print_r(ob_get_status(true));//Array//(//[0]=>Array//(//[name]=>默认输出处理程序//[type]=>0//[flags]=>112//[level]=>0//[chunk_size]=>0//[buffer_size]=>16384//[buffer_used]=>0//)//[1]=>Array//(//[name]=>默认输出处理程序//[type]=>0//[flags]=>112//[level]=>1//[chunk_size]=>0//[buffer_size]=>16384//[buffer_used]=>17//)//)ob_get_flush();ob_get_length()会返回当前缓冲区内容的长度,这里我们只打印了一个123,在缓冲区中保存了3个字符,所以输出正好是3。ob_get_level()返回当前缓冲区的级别,注意上面我们调用了两次ob_start(),也就是有两层buffer,这个buffer是可以嵌套的。ob_get_status()函数是buffer的状态信息,各个字段的描述可以在官方文档中找到,这里不再赘述。使用ob_start()的回调函数替换输出缓冲区的内容。这是一个例子,但它可以扩展到其他功能,比如全局输出过滤、CSS或JS文件的压缩优化等。ob_start(function($text){return(str_replace("apples","oranges",$text));});echo"这就像比较苹果和橘子",PHP_EOL;ob_get_flush();//就像比较橙子tooranges的最终输出是用橙子的内容替换苹果的内容。添加URL重写器output_add_rewrite_var('var','value');//somelinkscho'
