PHP的几种缓存总结

PHP的缓存大概有几种吧,页面静态式、服务器端模块式、内存式、文件数据式、按内容变更进行缓存。现在一一梳理总结一下。

页面静态式

1.全页面静态化缓存

        也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析

    的流程。此种方式,在CMS系统中比较常见,比如dedecms;

    一种比较常用的实现方式是用输出缓存:

    Ob_start()
    ******要运行的代码*******
    $content = Ob_get_contents();
    ****将缓存内容写入html文件*****
    Ob_end_clean();

2.页面部分缓存

        该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于ob_get_contents 的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存

任何一个Web网站的内容都是在不断更新和变化,但这并不意味这这个网站的内容就是动态内容,事实上,动态的内容是指用户每次点击 相同的链接时取的的内容是由Web服务器应用程序生成的,如常见得ASP,JSP等,与此相对应,静态内容一般就是指由文本、图像和多媒体组成,在用户每 次单击相应链接时基本保持不变。现在解决动态内容缓存的最新技术就是通过ESI技术来设计网站的内容。

服务器端模块式

1.apache缓存模块

        apache安装完以后,是不允许被cache的。如果外接了cache或squid服务器要求进行web加速的话,就需要在htttpd.conf里进行设置,当然前提是在安装apache的时候要**mod_cache的模块。

安装apache时:./configure –enable-cache –enable-disk-cache –enable-mem-cache

2.php APC缓存扩展

        Php有一个APC缓存扩展,windows下面为php_apc.dll,需要先加载这个模块,然后是在php.ini里面进行配置:

        [apc]

        extension=php_apc.dll

        apc.rfc1867 = on

        upload_max_filesize = 100M

        post_max_size = 100M

        apc.max_file_size = 200M

        upload_max_filesize = 1000M

        post_max_size = 1000M

        max_execution_time = 600 ; 每个PHP页面运行的最大时间值(秒),默认30秒

        max_input_time = 600 ; 每个PHP页面接收数据所需的最大时间,默认60

        memory_limit = 128M ; 每个PHP页面所吃掉的最大内存,默认8M

3.Opcode缓存

       

        我们知道,php的执行流程可以用下图来展示:

PHP的几种缓存总结

        首先php代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的php文件,第一次运行时 可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了。

        比较知名的是XCache、Turck MM Cache、PHP Accelerator等。

内存式

1.Memcached缓存

        memcached是高性能的分布式内存缓存服务器。 一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、 提高可扩展性。

        它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是 key–>value方式;

        <?php

        $memcachehost = '192.168.6.191';

        $memcacheport = 11211;

        $memcachelife = 60;

        $memcache = new Memcache;

        $memcache->connect($memcachehost,$memcacheport) or die ("Could not connect");

        $memcache->set('key','缓存的内容');

        $get = $memcache->get($key); //获取信息?>

2.Redis缓存

    Redis的简单使用,连接、开启和命令模式。

文件数据式

1.数据缓存

        顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品id去请求时,就会得出包括店铺信息、商品信息等数据,此时就可以将这些 数据缓存到一个php文件中,文件名包含商品id来建一个唯一标示;下一次有人想查看这个商品时,首先就直接调这个文件里面的信息,而不用再去数据库查 询;其实缓存文件中缓存的就是一个php数组之类;

Ecmall商城系统里面就用了这种方式;

2.查询缓存

        其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示;

按时间变更进行缓存

其实,这一条不是真正的缓存方式;上面的2、3、4的缓存技术一般都用到了时间变更判断;就是对于缓存文件您需要设一个有效时间,在这个有效时间 内,相同的访问才会先取缓存文件的内容,但是超过设定的缓存时间,就需要重新从数据库中获取数据,并生产最新的缓存文件;比如,我将我们商城的首页就是设 置2个小时更新一次;

3.文件缓存

HTML文件缓存、PHP类和文件缓存

按内容变更进行缓存

    这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件;

比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存;

当商家在后台修改这个商品的信息时,点击保存,我们同时就更新缓存文件;那么,买家访问这个商品信息时,实际上访问的是一个静态页面,而不需要再去访问数据库;

试想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了;

DNS缓存

即缓存DNS服务器。BIND是最广泛使用的开源名称服务器在RHEL中 , 通过bind软件包提供防火墙开启端口53/TCP和53/UDPBIND的主配置文件是/etc/named.conf/var/named目录包含名称服务器所使用的其他数据文件。

HTTP缓存

        即设置HTTP缓存头。对于PHP输出的内容,如果不是需要经常变动的内容(例如伪静态的一些页面,PHP输出JS或者CSS),使用PHP合理设置HTTP响应头添加缓存设置,让浏览器尽可能缓存下内容,在刷新和再次访问同样内容时,便不需要再次请求浏览器,从而能够大幅减少服务器的响应次数,同时浏览器呈现页面也会加快了,这是非常有用的一个技巧。

        1、输出Cache-Control头:header('Cache-Control:max-age=120');
            这个的输出是表明让浏览器缓存120秒。这个指令很有用,但是局限性在于,刷新这个页面时还是会重新请求,所以你会感觉这个头好像没什么作用,但是对于一些输出的JS、CSS内容时是有用的,也就是说你刷新的页面不是它本身,而只是引用了设置有此头的PHP文件的话,它就会在你指定的时间内从本地缓存中读取内容而不会请求服务器。同时通过超链接过来的已经请求过的页面时,你也会看到浏览器从本地cache里读取而不用通过服务器。

        2、更高级玩法:通过设置Last-Modified、Expires头设定缓存
如下面这段代码


        <?php
        $interval=120; //2分钟
        if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])){
            // HTTP_IF_MODIFIED_SINCE即下面的: Last-Modified,文档缓存时间.
            // 缓存时间+时长.
            $c_time = strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE'])+$interval;
            // 当大于当前时间时, 表示还在缓存中... 释放304
            if($c_time > time()){
                header('HTTP/1.1 304 Not Modified');
                exit();
            }
        }
        header('Cache-Control:max-age='.$interval);
        header("Expires: " . gmdate("D, d M Y H:i:s",time()+$interval)." GMT");
        header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
        echo ' - <a href="">点击重新载入本页面</a><br />';
        当浏览器首次访问时,请求头不会带HTTP_IF_MODIFIED_SINCE这个东西,所以我们就设置了三个头。一个就是刚才第1点,Cache-Control头,告诉让浏览器自己缓存个120秒。
第二个头Expires是表明,在当前时间的120秒后缓存失效,浏览器会在120秒后把缓存失效,再次请求时会到服务器端请求而不是本地。
第三个头Last-Modified则是说明这个文档最后修改时间。可以看出输出的当前时间。
        当浏览器再次访问时(刷新页面),浏览器因为在第一次时接收到了Last-Modified,它便会根据这个时间去检查服务器的文档是否更新过,也就是会把这个时间用HTTP_IF_MODIFIED_SINCE这个东西带过去,于是也就有了第一个花括号内容的判断。而花括号内再次根据这个时间加上你设置的时间(120秒),看看是不是超出了当前的时间time(),如果超出了,那就是还在缓存期内,帮直接返回304,然后直接退出。这时候浏览器便会自动用缓存的内容。这样子做,服务器返回的内容就很短,只是一个304响应头而已,而内容不需要返回,这可大大节省网络流量,显然浏览器的响应速度也会感觉明显快了。

        按F5刷新或者按浏览器的刷新按钮时,你将发现2分钟内你的PHP请求将是304状态返回。
        强制刷新(CTRL+F5)时,浏览器不会带HTTP_IF_MODIFIED_SINCE这个东西去判断,所以同正常浏览一样,返回200状态。这个逻辑是正常的,因为强制刷新本就相当于完全请求一遍最新内容。

        浏览器头中的缓存设置虽然技巧虽小,但是在web应用中非常有用。合理利用浏览器的缓存,尽量避免重复内容的请求,一个页面少了几十KB的请求,流量大的网站一天能够节省几百M甚至几G的网络流量。这对提升用户体验来说也是一个相当重要的设置项。

 

 

 

转载于:https://my.oschina.net/Shinsg/blog/1579744