php中ob函数的用法

与输出缓冲区有关的配置
  在PHP.INI中,有两个跟缓冲区紧密相关的配置项
  1.output_buffering
    该配置直接影响的是php本身的缓冲区,有3种配置参数.on/off/xK(x为某个整型数值);
    on - 开启缓冲区
    off - 关闭缓冲区
    256k - 开启缓冲区,而且当缓冲区的内容超过256k的时候,自动刷新缓冲区(把数据发送到apache);

  2.implicit_flush
    该配置直接影响apache的缓冲区,有2种配置参数. on/off
    on - 自动刷新apache缓冲区,也就是,当php发送数据到apache的缓冲区的时候,不需要等待其他指令,直接就把输出返回到浏览器
    off - 不自动刷新apache缓冲区,接受到数据后,等待刷新指令

而默认直接是开启缓冲区的,所以我们可以直接不用ob_start(),所以我先把缓冲区关闭

下面几个函数的用法

  • ob_start() - 打开缓冲区
  • ob_get_contents() - 返回输出缓冲区的内容
  • ob_flush() - 冲刷出(送出)输出缓冲区中的内容
  • ob_clean() - 清空(擦掉)输出缓冲区
  • ob_end_flush() - 冲刷出(送出)输出缓冲区内容并关闭缓冲
  • ob_end_clean() - 清空(擦除)缓冲区并关闭输出缓冲
  • flush() - 刷新输出缓冲 

ob_start()在服务器打开一个缓冲区来保存所有的输出。所以在任何时候使用echo ,输出都将被加入缓冲区中,直到程序运行结束或者使用ob_flush()来结束。然后在服务器中缓冲区的内容才会发送到浏览器,由浏览器来解析显示。

ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World";

$out2 = ob_get_contents();

输出:

Hello World

如果只是想要存储缓存区而不是输出的话加上ob_end_clean();

ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World";

$out2 = ob_get_contents();

ob_end_clean();

可以看到浏览器上没有任何输出,这时我们加上var_dump来看看out1、out2两个变量

ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World";

$out2 = ob_get_contents();



ob_end_clean();
var_dump($out1, $out2);

输出:

string(6) "Hello " string(11) "Hello World"

接下来讲ob_clean()跟ob_end_clean()的区别

使用 ob_end_clean()

扫描二维码关注公众号,回复: 2407739 查看本文章
ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World1";

$out2 = ob_get_contents();

ob_end_clean();

echo "World2<br>";
echo "World3<br>";

$out3 = ob_get_contents();

var_dump($out3);

输出:

World2
World3
bool(false)

使用 ob_clean()

ob_start();

echo "Hello ";

$out1 = ob_get_contents();

echo "World1";

$out2 = ob_get_contents();

ob_clean();

echo "World2<br>";
echo "World3<br>";

$out3 = ob_get_contents();

var_dump($out3);

输出:

World2
World3
string(20) "World2
World3
"

这里我们对out3使用转义函数

var_dump(htmlentities($out3));

输出:

World
World
string(32) "World<br/>World<br/>"

解释

ob_end_clean() 跟ob_clean() 都是清空了缓冲区,不让echo输出到浏览器,这是共同点,而不同点是ob_end_clean()还关闭了缓冲区

接下来讲ob_end_flush()跟ob_flush()跟flush()的区别

使用ob_end_flush()

ob_start();

echo "Hello<br/>";

$out1 = ob_get_contents();

echo "World1<br/>";

$out2 = ob_get_contents();


ob_end_flush();

echo "World2<br/>";
echo "World3<br/>";

$out3 = ob_get_contents();


var_dump(htmlentities($out3));

输出

Hello
World1
World2
World3
string(0) ""

补充:这里为了显示容易观察,我全部都给了<br>

使用ob_flush()

ob_start();

echo "Hello<br/>";

$out1 = ob_get_contents();

echo "World1<br/>";

$out2 = ob_get_contents();


ob__flush();

echo "World2<br/>";
echo "World3br/>";

$out3 = ob_get_contents();


var_dump(htmlentities($out3));

输出

Hello
World1
World2
World3
string(32) "World2<br/>World3<br/>"

使用flush()

ob_start();

echo "Hello<br/>";

$out1 = ob_get_contents();

echo "World1<br/>";

$out2 = ob_get_contents();


flush();

echo "World2<br/>";
echo "World3br/>";

$out3 = ob_get_contents();


var_dump(htmlentities($out3));

输出

Hello
World1
World2
World3
string(67) "Hello<br/>World1<br/>World2<br/>World3<br/>"

区别

可以看出ob_end_flush() 是输出了缓冲区的内容并且关闭了缓冲区,而ob_flush()只是刷出了缓冲区内容,相当于将缓冲区清空,而flush()输出了缓冲区内容也没有将缓冲区清空,所以下面的缓冲区内容还会继续追加。

总结

只能在实践中继续成长,有什么不对的地方望大家指出。

猜你喜欢

转载自blog.csdn.net/qq_33862778/article/details/80787510