定义
一个控制 PHP 脚本输出的函数,PHP 输出数据时会先将数据存储在内存中的一块区域,等待缓冲区内存满了或者脚本执行完毕时,再将数据一次性输出,这块临时存储数据的内存就叫缓冲区。
作用
缓冲区也叫缓存,作用是为了解决速度不匹配的问题,高速的 CPU 与内存,内存与硬盘,CPU 与 IO 等速度不匹配的问题,而引人缓冲区,比如我们从磁盘里读取信息,我们先把读出的数据放在缓冲区,计算机再直接从缓冲区中读取数据,等缓冲区的数据读取完后再去磁盘中读取,这样就可以减少磁盘的读写次数,再加上计算机对缓冲区的操作大大快于对磁盘的操作,故应用缓冲区可大大提高计算机的运行速度。
配置项
output_buffering:设置为 On 时,在所有的脚本中使用输出控制,如果要限制输出缓冲区的最大值,可将该选项设定为指定的最大字节数(例如 output_buffering=4096),关闭可设置 0 或 Off
output_handler:该选项可将脚本所有的输出,重定向到一个函数。设置的任何处理函数,将自动的处理输出缓冲。
implicit_flush:默认为 FALSE。如将该选项改为 TRUE,PHP 将使输出层,在每段信息块输出后,自动刷新。
ob 函数
ob_start:打开输出控制缓冲
ob_get_contents:返回输出缓冲区的内容,如果输出缓冲区无效将返回 FALSE 。
flush:刷新输出缓冲,该函数将当前为止程序的所有输出发送到用户的浏览器。
ob_flush:输出缓冲区中的内容,操作完成清除缓冲区
ob_end_flush:输出缓冲区内容并关闭缓冲,成功返回 TRUE,失败返回 FALSE
[ob_clean](https://www.php.net/manual/zh/function.ob-clean.php
):清空输出缓存区,输出缓冲必须已被 ob_start() 以 PHP_OUTPUT_HANDLER_CLEANABLE 标记启动。否则 ob_clean() 不会有效果。
ob_end_clean:清空缓冲区并关闭输出缓冲,成功返回 TRUE,失败返回 FALSE
ob_get_clean:获取当前缓冲区内容并删除当前缓冲区,失败返回 FALSE
ob_get_flush:以字符串的形式获取输出缓冲区内容,并关闭输出缓冲区,失败返回 FALSE
ob_get_length:返回输出缓冲区内容的长度,失败返回 FALSE
ob_get_level:返回输出缓冲机制的嵌套级别,失败返回零
ob_get_status:得到所有输出缓冲区的状态
ob_gzhandler:在ob_start中使用的用来压缩输出缓冲区中内容的回调函数,如果一个浏览器不支持压缩过的页面,此函数返回 FALSE
ob_implicit_flush:打开或是关闭刷新缓存区,TRUE 为打开,FALSE 为关闭
ob_list_handlers:列出所有使用中的输出处理程序
output_add_rewrite_var:添加URL重写器的值,form 表单以隐藏域添加键值,相对路径以 GET 参数形式拼接,绝对路径无效
output_reset_rewrite_vars:重设URL重写器的值,恢复因 output_add_rewrite_var 函数改动的值
应用场景
1.解决 PHP header 函数会被之前执行的输出无效化的问题,例:
<?php
echo 'Hello World';
header('Location: https://www.baidu.com');
在缓存区没有打开的情况下,header 函数不会被正确执行,会返回一个 Warning 级别错误 "Cannot modify header information - headers already sent by" ,因为缓冲区关闭后,脚本是即时输出的,当输出 echo 语句时,已经给浏览器返回了响应头,这时候 header 函数想再去修改响应头就已经晚了。该方法常用于框架,这使开发者不必再关心修改响应头之前是否已经有输出。
2.抑制包含脚本中的输出,例
ob_start();
//require 'echo.php';
include 'echo.php';
ob_end_clean();
3.页面静态化,页面静态化后会把动态渲染的模板生成 HTML 文件,页面内容直到删除或是有效时间到期前不会再改变。当请求流量很大时,所有的客户都会访问 HTML 文件,避免了直接对数据库的查询,加快页面的打开速度,但静态化同时会产生很多文件,对磁盘容量需要关注,避免超载。
<?php
header("Content-Type:text/html;charset=utf-8"); //设置编程字符
$file = 'test.html'; //静态化文件
$expr = 3600 * 24 * 7; //设置7天有效期
//文件存在并且不是目录
if(file_exists($file) && !is_dir($file)){
//获取文件最后修改时间
$last_edit_time = filectime($file);
//如果超过静态化时间,重新写入
if(time() > ($last_edit_time + $expr)){
echo 'Hello World Ob test page';
$content = ob_get_contents();
$work_file = fopen($file,'w');
fwrite($work_file,$content);
fclose($work_file);
ob_end_clean();
}else{
include $file;
exit;
}
}else{
//没有文件时创建,并把模板内容写入
echo 'Hello World Ob test page';
$content = ob_get_contents();
$work_file = fopen($file,'w');
fwrite($work_file,$content);
fclose($work_file);
ob_end_clean();
}
网友评论