① 我们要说一下php中的缓存大概有哪些!

在php中,我们可以粗略的将缓存分为客户端缓存(Browser缓存),服务器端缓存(Server缓存)。由于php是基于b/s架构的,所有,我们可以理解为浏览器端的缓存,服务器端缓存。
在服务器端php自带的缓存中,主要可以分为两大类缓存!程序缓存和ob缓存!这也是我们学习服务器端缓存的主要内容!

②服务器端的响应流程

A、客户端向服务器端发送请求响应!
B、apache服务器加载了php模块,开启相应的进程(或线程)运行相应的php脚本页面!
C、在没有开启ob缓存的情况下,运行的结果全部都会被放到程序缓存中,然后打包发送给浏览器!浏览器对页面进行渲染,生成我们最后看到的web页面!
D、在开启了bo缓存的情况下,运行的结果会被分别放入到ob缓存和程序缓存中,当程序运行到最后一行的时候,就会将ob缓存中的数据刷回到程序缓存中,然后打包返回给浏览器!浏览器对页面进行渲染,生成我们看到的web页面!

③ob缓存的常见用法!

a、在脚本刚开的时候调用ob_start()函数,它的作用是开启ob缓存,究其实质是,在当前脚本中,是将php.ini配置文件的output_buffering选项开启!但是,除了开启ob缓存,其实obstart还有一个回调函数!在下面的例子,我们将所有的http://替换为了ftp://
举例如下:

<?php
    function filterWord($str)
    {
        $str = str_replace('http://', 'ftp://', $str);
        return $str;
    }
    ob_start('filterWord');
    for($number=1; $number<=100;$number++) {
        $url = " http://www.google.com.hk <br/> ";
        echo $url;
    }
    //将ob缓存中的内容刷到程序缓存中,并关闭ob缓存
    ob_end_flush();
?>

注意:在php5.3以后ob缓存默认是开启的!

b、将ob缓存中的数据,刷回到程序缓存中!
ob_flush(),将ob缓存中的内容,刷到程序缓存中!但并没有关闭ob缓存
ob_end_flush(),关闭ob缓存,并将数据刷回到程序缓存中!

c、清空ob缓存中的内容
ob_clean(),将ob缓存中的内容清空!
ob_end_clean(),将ob缓存中的数据清空,并且关闭ob缓存!

d、获的当前ob缓存中的内容!
ob_get_contents(),获取当前ob缓存中的内容
ob_get_clean(),获取当前ob缓存中的内容,并且清空当前的ob缓存

④ob缓存的作用!

ob缓存在各个方面都有应用,但是,本人知道的主要是在两个方面!
a、当网站准备做网站静态化的时候,选择ob缓存是一个不错的选择!

b、解决Warning: Cannot modify header information - headers already sent by的错误!
究其发生错误的原因:是因为响应头和相应主体位置错位导致的!正常情况下,服务器返回给浏览器的相应内容,应该是:响应头+响应主体!
但是,如果我们开启了ob缓存,那么相应头信息(一般也就是header()函数进行设置的信息),会被放入到程序缓存中!
而其他的输出内容,如:echo print_r var_dump 等,都会先被放入ob缓存中!
等程序结束的时候,或者ob缓存关闭的实话,将ob缓存的内容在放入程序缓存中!从而保证响应头信息,始终在响应主体内容之前!

⑤参考资料:

http://blog.sina.com.cn/s/blog_9bbafb790101cmpb.html
php经典实例
php手册


maweibinguo
783 声望36 粉丝

后端开发工程师一枚, keep moving