ob-clean和ob-end-clean的区别

PHP中两个函数都有清空缓冲区的作用, 它们的区别又是什么呢?
代码如下:


输出:

1
2
3
4
5
6
我是第二个echo
我是第二个echo
我是第四个echo
我是第二个echo
我是第二个echo
我是第四个echo

分析如下:

  • 第一个echo输出只是把字符串放入缓冲区并没直接输出,而ob_clean()会把缓冲区的内容清空,所以不会输出。
  • 第二个echo被放入缓冲区, 而ob_get_contents()会把缓冲区的内容获取到,等效第二个echo。所以会有两次第二个echo
  • 第四个echo也被放入缓冲区,
  • 最后一个ob_get_contents()会把上面所有的缓冲区内容全部获取到,等效重复之前的步骤。
  • 程序结束,会输出缓冲区的内容。

当注释掉ob_clean()开启ob_end_clean()之后:

输出:

1
2
我是第二个echo
我是第四个echo

分析如下:

  • 第一个echo一样不输出,因为ob_clean()ob_end_clean()都是有清楚缓冲区的功能。 而ob_end_clean()的第二个功能就是关闭缓冲区。 这也就是造成结果不同的原因。
  • 第二个echo不会放入缓冲区,而是直接输出。 为什么我会这样说呢? 因为接下来的ob_get_contents()并没有输出东西。
  • 第四个echo也是直接输出,因为它之后的ob_get_contents()也是没有输出任何东西。
  • 程序结束,会输出缓冲区的内容。
  • 所以ob_end_clean()用了之后,不仅清空缓冲区的内容。还会关闭缓冲区,之后的输出都是直接输出而不经过缓冲区。

看到有说,当缓冲区大于 4k 就会强制输出

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注