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相关函数解释

  1. ob_flush()和flush(),在上一节中讲过两个函数的区别,不过要注意windows和linux系统中,这两个函数的实现并不一样,为了保持兼容性一定要保证调用顺序ob_flush()在前。
  2. ob_start(),此函数将打开输出缓冲。当输出缓冲激活后,脚本将不会输出内容(除http标头外),相反需要输出的内容被存储在内部缓冲区中。ob_start()可以嵌套,但是必须使用相同数量的关闭ob操作。
  3. ob_clean() — 清空(擦掉)输出缓冲区。
    ob_end_clean() — 清空(擦除)缓冲区并关闭输出缓冲。
    ob_end_flush() — 冲刷出(送出)输出缓冲区内容并关闭缓冲。
  4. ob_get_clean() — 得到当前缓冲区的内容并删除当前输出缓。
    ob_get_contents() — 返回输出缓冲区的内容,例如在静态页面缓存中的应用。
    ob_get_flush() — 刷出(送出)缓冲区内容,以字符串形式返回内容,并关闭输出缓冲区。
    ob_get_length() — 返回输出缓冲区内容的长度。
    ob_get_level() — 返回输出缓冲机制的嵌套级别。
    ob_get_status() — 得到所有输出缓冲区的状态,它的输出结果是一个状态数组,具体意义如下表:
KeyValue
level输出嵌套级别
typePHP_OUTPUT_HANDLER_INTERNAL (0) 或者 PHP_OUTPUT_HANDLER_USER (1)
statusPHP_OUTPUT_HANDLER_START (0), PHP_OUTPUT_HANDLER_CONT (1) or PHP_OUTPUT_HANDLER_END (2) 三个之一
name起作用的输出处理程序的名字,或者是默认的输出处理程序的名字(如果没有设置的话)
delob_start()设置的删除标签

虽然还有其他跟缓冲区相关的函数,但是一般使用不到,这些已经可以让我们灵活使用PHP的输出缓冲区了。

 

转载自:https://caoyi.me/php-output-buffer-2/

转载于:https://www.cnblogs.com/wpjamer/articles/6535043.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值