缓存可以分三种
- 输出缓存,即output buffering.简称OB缓存.
- 程序缓存
- 浏览器缓存
输出缓存和程序缓存都是服务器端的缓存. 而浏览器缓存属于客户端缓存.
程序缓存:
前言 : 假设OB缓存没开启,当PHP脚本运行时,其运行内容我们可以分成输出部分和程序部分.
输出部分: 如echo,print_r,var_dump的内容.
程序部分: 除了输出部分,其他的都是程序部分.
下面看这段代码 :
<?php ob_start();//打开ob缓存 echo 'hello word';//输出部分 header('content-type:text/html; charset=utf-8');//程序部分 echo 'hello word';//输出部分?>
运行输出 :
分析:
两次 “hello word” 都输出了,但是中间有个warning级别的报错.大致意思是:warning: 不能修改头部信息 – 头部信息已经发出.
从HTTP协议的角度上讲,每次请求都是有固定格式组成.先是头部信息然后是主体内容(也就是输出的内容).回过头看上面的代码,先输出内容后,又设置了头部信息
结构上就错了,所以会报错.
讲了那么多,好像还没提到程序缓存?
答: 确实如此,在讲程序缓存前还需澄清一个误区.依然看那段代码:
<?php ob_start();//打开ob缓存 echo 'hello word';//输出部分 header('content-type:text/html; charset=utf-8');//程序部分 echo 'hello word';//输出部分?>
也许你会认为PHP脚本在运行后,每执行到一个输出语句时(如echo)浏览器会直接输出内容,事实并非如此,而是将PHP脚本运行的内容全部(也就是输出部分和程序部分)放入程序缓存.当PHP脚本运行结束后,
程序缓存将内容交给浏览器,最后由浏览器输出.
如图:
OB缓存(output buffering)
OB缓存默认是没有打开的,打开方法:通过设置php.ini配置文件output_buffering = 4096 或者 在脚本中用系统函数ob_start()开启OB缓存
output buffering 中文的意思是:输出缓冲 . 它的功能是将PHP脚本中的输出部分全部放入OB缓存中而不是放入程序缓存.脚本运行结束后,
OB缓存将全部内容集中放入程序缓存的末尾.
看如下代码:
<?php ob_start();//打开ob缓存 echo 'hello word';//输出部分 header('content-type:text/html; charset=utf-8');//程序部分 echo 'hello word';//输出部分?>
输出效果:
神奇的事发生了,跟之前的代码一样.代码中依然是先输出了内容,然后再设置的头部信息.但是开启ob缓存后却没有报错.下面分析下流程:
在最后的程序缓存中,header()函数是在输出之前设置的,所以最后按顺序执行是不会报错的.
OB缓存系列函数
ob_start()函数:打开输出缓冲区.
函数格式
ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在ob缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。
Flush:将程序缓存区刷新到浏览器输出。
函数格式:flush()
说明:这个函数经常使用,效率很高。
ob_get_contents :返回OB缓存区的内容。
函数格式:string ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE.
ob_get_length:返回OB缓存区的长度。
函数格式:int ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活,则返回 FALSE.
ob_clean : 删除OB缓存区的内容
函数格式:void ob_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除
ob_end_clean:删除OB缓存区的内容,并且关闭OB缓存区
函数格式:void ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除
ob_flush() : 将OB缓存的内容更新到程序缓存中,并清除OB缓存.
ob_end_flush: 发送OB缓存区的内容到程序缓存区,并且关闭OB缓存区
函数格式:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话)