PHP 缓存技术总结

1、全页面静态化缓存

也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;

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

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

2、页面部分缓存

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

该种方式可以用于如商城中的商品页;

3、数据缓存

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

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

3.1查询缓存

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

按时间变更进行缓存

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

3.2 按内容变更进行缓存

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

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

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

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

4、内存式缓存

提到这个,可能大家想到的首先就是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);       //获取信息
?>

5、apache缓存模块

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

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

一、详解浏览器缓存机制

  对于,如何说明缓存机制,在网络上找到了两张图,个人认为思路是比较清晰的。总结时,上图。

  这里需要注意的有两点:

     1、Last-Modified、Etag是响应头里的数据

     2、If-None-Match、If-Modified-Since是请求头里的数据

     Last-Modified/If-Modified-Since这种搭配,好像已经过时了。在测试时,就是关掉etag,并时间过期了,服务器也照样返回304。

  Etag/If-None-Match这种搭配,还挺好用的。测试时,可用。那就解释下什么是etag?什么是if-none-match?

    etag:当前资源的唯一标识。是文件的索引节、文件大小、文件创建时间组合的hash。

    if-none-match:这就是上面etag的copy。但是,请求服务器时,如果发现if-none-match与etag不对应时,就说明文件被修改了,这时返回200,重新获取文件,没修改则返回304,继续使用缓存文件。

  好了,可以看流程图了。

  首次访问页面时的流程

  

  再次访问页面时的流程

   


  第一次看的时候有点蒙,于是,又给装修了下。再次亮图。

     

    以上几张流程图就很好说了浏览器的缓存机制。

     

二、Apache设置缓存

  使用Apache的.htaccess设置缓存有三种方法

    第一种方法:

      在Apache开启mod_expires.so模块

      在配置文件中打开:LoadModule expires_module modules/mod_expires.so

      在.htaccess添加以下内容


<IfModule mod_expires.c>
#打开缓存
ExpiresActive On
#默认对所有资源缓存600秒
ExpiresDefault A600
#png格式的资源缓存5秒
ExpiresByType image/png A5
#jpg格式的资源缓存50秒
ExpiresByType image/jpg A50

#好含这些后缀的资源,都缓存100秒
<FilesMatch "\.(jpg|jpeg|png|gif|swf)$">
ExpiresDefault A100
</FilesMatch>

</IfModule>

      

    第二种方法:

      在Apache开启mod_headers模块

      去配置文件中添加以下内容:

        LoadModule headers_module modules/mod_headers.so

      在.htaccess中添加内容:

#包含这些后缀的资源都缓存33秒
<FilesMatch ".(flv|gif|jpg|jpeg|png|ico|swf)$">
Header set Cache-Control "max-age=33"
</FilesMatch>

    

 第三种方法:

      在.htaccess添加以下内容:

FileEtag INode Mtime Size

      要关闭etag,则添加以下内容:

FileEtag none

    

    经过测试,这几种方法同时使用,则会出现优先级:

      第三种方法>第二种方法>第一种方法

    还发现了一些小知识,Apache不缓存能解析的资源文件,比如php、php3等。如果修改配置文件,致使可以解析jpg格式的文件,那就不能缓存jpg格式的文件。可在配置文件中,添加以下代码,做测试:

        AddType application/x-httpd-php .jpg

 参考网页:

  http://www.cnblogs.com/skynet/archive/2012/11/28/2792503.html

  http://my.oschina.net/leejun2005/blog/369148

  http://yixun.yxsss.com/yw13.html



6、Opcode缓存

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


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

比较知名的缴存管理工具:APC、  XCache、Turck MM Cache、PHP Accelerator等。


6.1、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

APC简介

APC的全称为Alternative PHP Cache, 是一款开源的php插件,用来对php的代码或者用户数据进行缓存。

APC 对php代码的缓存

apc可以去掉php动态解析以及编译的时间,php脚本可以执行的更快。下面这张图很好的说明了为什么了apc可以让php脚本运行得更快。


PHP是一个动态脚本语言,所以为了让用户在浏览器中看到页面内容,服务器必须解析php代码从而生成想用的html代码。从上面的图中可以看出,在没有apc的时候,用户对php页面的每一次请求,服务器都需要进行对php进行解析,编译以及执行,但是很多时候,只要php代码没有发生更改,php的执行逻辑就不会改变,也就是说解析以及编译的过程就可以省略,直接执行然后将结果返回即可。这就是apc的工作,apc缓存php的可执行代码,从而去掉了解析以及编译的过程,加快了php脚本的执行速度。

APC 对用户数据的缓存以及

除了缓存php代码外,apc还可以进行用户数据的缓存,但是由于apc的容量很少,所以缓存的数据最好是那些很长时间都不变的数据,不变的单位应该以天位单位。所以如果数据是变化很频繁的并且数据量也比较大,那么就不要使用apc了,可以使用memcache或者redis。

下面是一个apc和redis的对比测试实验,看一下apc和redis的效率对比。

[php]  view plain  copy
  1. function getTimeStamp() {  
  2.   $timestr = microtime();  
  3.   $timestrary = explode(' '$timestr);  
  4.   $result = intval($timestrary[1])*1000 + intval(floatval($timestrary[0])*1000);  
  5.   return $result;  
  6. }   
  7. $redis = new Redis();  
  8. $redis->connect('127.0.0.1', 6379);  
  9. $key = 'key';  
  10. $value ='value';  
  11. $redis->set($key$value);  
  12.     
  13. apc_store($key$value, 1);   
  14.     
  15. $begin = getTimeStamp();  
  16. for($i = 0 ; $i < 100000 ; $i = $i +1) {  
  17.   $result = apc_fetch($key);  
  18. }   
  19. $cost = getTimeStamp() - $begin;  
  20. var_dump($cost);  
  21. $begin = getTimeStamp();  
  22. for($i = 0 ; $i < 100000 ; $i = $i +1) {  
  23.   $result = $redis->get($key);  
  24. }   
  25. $cost = getTimeStamp() - $begin;  
  26. var_dump($cost);  
  27. $redis->close();  
  28.     

都是简单的取数据操作,分别进行10万次,单位是毫秒。最后的运行结果redis10万次读在4-5秒之间,而apc得10万次读只有50毫秒左右。可以看到如果是简单的缓存一些数据,并且这些数据不会变化且命中的话,apc还是能带来一定的效率提升的。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值