php output详解,【PHP】Output Control 扩展详细解读

本文详细介绍了PHP中的输出缓冲区机制,包括output_buffering、ob系列函数的使用,以及它们在解决header冲突、抑制脚本输出和页面静态化中的关键作用。通过实例演示了如何利用这些技巧提高脚本性能和开发效率。

定义

一个控制 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:清空输出缓存区,输出缓冲必须已被 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 函数会被之前执行的输出无效化的问题,例:

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 文件,避免了直接对数据库的查询,加快页面的打开速度,但静态化同时会产生很多文件,对磁盘容量需要关注,避免超载。

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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值