PHP输出缓冲区(二):使用
了解了PHP输出缓冲区的大概原理, 我们来看看输出缓冲区是如何使用的。
一、使用场景
- 防止在浏览器有输出之后再使用setcookie()、header()和session_start()等发送头文件的函数造成的错误。
header()函数在官网中有描述:请注意 header() 必须在任何实际输出之前调用,不管是普通的 HTML 标签,还是文件或 PHP 输出的空行,空格。因此如果需要在发送头文件信息之前发送数据,则需要使用输出缓冲区来保存数据。
- 对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
- 生成静态文件,然后存成文件。经常在生成HTML,或者整页缓存中使用。
- 任何需要提高性能的场景,都应该使用PHP输出缓冲区,当然需要你的进一步优化。
二、使用方法
如果你使用默认的配置(缓冲区有4k),则已经在使用PHP输出缓冲区。如果你的配置文件中output_buffering是off或者0,或者要缓存4k以上的数据,使用ob_start()开启PHP输出缓冲。
ob_start(); echo "这些数据将会输出到缓冲区中"; //do something
如果想提前输出缓冲区的内容,则需要调用ob_flush(),如果想关闭缓冲区并输出内容需调用ob_end_flush()。
在调用ob_start()开启缓冲区后,使用header()和setcookie()函数时并不用担心他们的处理,这些信息将会被写到消息头缓冲区中。要注意,使用session_start()时,如果用户联合使用 ob_start() 和 ob_gzhandler 函数, 那么函数的调用顺序会影响输出结果。
如果你没有在php.ini文件里设置output_handler,则ob_start()也可以接受一个参数来指定缓冲结束的回调函数。例如gzip压缩输出的内容:
<?php ob_start('ob_gzhandler'); echo "My content!"; ob_end_flush();
PHP使用缓冲区用来生成静态页面,是加速网站应用的好办法,很多模板引擎也会看到在使用。生成静态页面的标准用法:
<?php ob_start('ob_gzhandler'); //生成你的网站内容 $content = ob_get_contents(); //获取缓冲区中的内容 $file = fopen('./index.html', 'w'); fwrite($file, $content); //将缓冲区中的内容写入文件 fclose($file); ob_end_clean(); //清空并关闭缓冲区
在开启ob_start()后,可将缓冲区看做无限大,调用输出缓冲的函数或者脚本结束则输出缓冲区内容。如果使用output_buffering配置项来控制缓冲区大小,那要保证PHP和Web Server通信的次数比较小,这样效率会更高,不过不管怎样,通过socket一个字节一个字节地传输性能肯定不好。
三、ob相关函数解释
- ob_flush()和flush(),在上一节中讲过两个函数的区别,不过要注意windows和linux系统中,这两个函数的实现并不一样,为了保持兼容性一定要保证调用顺序ob_flush()在前。
- ob_start(),此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。ob_start()可以嵌套,但是必须使用相同数量的关闭ob操作。
- ob_clean() — 清空(擦掉)输出缓冲区。
ob_end_clean() — 清空(擦除)缓冲区并关闭输出缓冲。
ob_end_flush() — 冲刷出(送出)输出缓冲区内容并关闭缓冲。 - ob_get_clean() — 得到当前缓冲区的内容并删除当前输出缓。
ob_get_contents() — 返回输出缓冲区的内容,例如在静态页面缓存中的应用。
ob_get_flush() — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
ob_get_length() — 返回输出缓冲区内容的长度。
ob_get_level() — 返回输出缓冲机制的嵌套级别。
ob_get_status() — 得到所有输出缓冲区的状态,它的输出结果是一个状态数组,具体意义如下表:
Key | Value |
---|---|
level | 输出嵌套级别 |
type | PHP_OUTPUT_HANDLER_INTERNAL (0) 或者 PHP_OUTPUT_HANDLER_USER (1) |
status | PHP_OUTPUT_HANDLER_START (0), PHP_OUTPUT_HANDLER_CONT (1) or PHP_OUTPUT_HANDLER_END (2) 三个之一 |
name | 起作用的输出处理程序的名字,或者是默认的输出处理程序的名字(如果没有设置的话) |
del | 由ob_start()设置的删除标签 |
虽然还有其他跟缓冲区相关的函数,但是一般使用不到,这些已经可以让我们灵活使用PHP的输出缓冲区了。
转载自:https://caoyi.me/php-output-buffer-2/