php缓存处理技术

缓存可以分三种

  1.   输出缓存,即output buffering.简称OB缓存.
  2.   程序缓存
  3.   浏览器缓存

输出缓存和程序缓存都是服务器端的缓存. 而浏览器缓存属于客户端缓存.

程序缓存:

前言 : 假设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)
说明:这个函数发送输出缓冲区的内容(如果有的话)

Posted in 未分类