关于APC(Alternative PHP Cache)和MemCache

来源:互联网 发布:js设置css属性 编辑:程序博客网 时间:2024/06/05 10:35

http://slj.me/2009/04/apcalternative-php-cache-memcache/



APC(Alternative PHP Cache)
APC是一种对PHP有效的开放源高速缓冲储存器工具,它能够缓存opcode的php中间码。APC是一种php的缓存解决方案,目前以pecl方式发布,有消息说将会出现在php6版本的内核.

一.安装方法

1)从http://pecl.php.net/package/apc下载相应版本
2)解压
3)进入源码目录
4)执行php安装目录下的bin/phpize
5)./configure –enable-apc –enable-apc-mmap –with-apxs=path-to-apache/bin/apxs –with-php-config=path-to-php/bin/php-config
6)make && make install
7)将生成的apc.so加载到php.ini(extesion=apc.so,注意extension_dir的设置)一般地,编译生成的.so会在php安装路径的lib/php/extensions下
8)重启,apache

写一个phpinfo看看

注:windows下,只要到http://snaps.php.net/的相应分支下下载php_apc.dll,再在php.ini中加载即可

060925175835

二.用法

apc的用法比较简单,只有几个函数,列举如下
apc_clear_cache() 清除apc缓存内容
默认(无参数)时,只清除系统缓存,要清除用户缓存,需用’user’参数
apc_define_constants ( string key, array constants [, bool case_sensitive] )
将数组constants以常量加入缓存
apc_load_constants (string Key)
取出常量缓存
apc_store ( string key, mixed var [, int ttl] )
在缓存中保存数据
apc_fetch ( string key )
获得apc_store保存的缓存内
容apc_delete ( string key )
删除apc_store保存的内容

完整例子如下(PHP代码):

view plaincopy to clipboardprint?
  1. //apc test  
  2. //constants  
  3. $constants = array('APC_FILE' => 'apc.php''AUTHOR' => 'tim');  
  4. apc_define_constants('numbers'$constants);  
  5. apc_load_constants('numbers');  
  6. echo 'APC_FILE='.APC_FILE.' 
  7. ';  
  8. echo 'AUTHOR='.AUTHOR.' 
  9. ';  
  10.   
  11. //variable  
  12. if(!apc_fetch('time1')) apc_store('time1', time());  
  13. if(!apc_fetch('time2')) apc_store('time2', time(),2); //set ttl  
  14. echo 'time1:'.apc_fetch('time1').' 
  15. ';  
  16. echo 'time2:'.apc_fetch('time2').' 
  17. ';  
  18.   
  19. //object  
  20. class a{  
  21. function b(){return 'i am b in class a';}  
  22. }  
  23. apc_store('obj',new a());  
  24. $a = apc_fetch('obj');  
  25. echo $a->b();  
  26. echo ' 
  27. ';  
  28. //array  
  29. $arr = array('a'=>'i am a','b'=>'i am b');  
  30. apc_store('arr',$arr);  
  31. $apc_arr = apc_fetch('arr');  
  32. print_r($apc_arr);  

提示:你可以刷新一下,看ttl设置是否生效
在 PHP Cache 层,Facebook 采用了 APC。

参考资料:http://hi.baidu.com/flyhart/blog/item/25280a4c3b90d6ffd62afc12.html

再说说MemCache

一、概念
 memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端,同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcache作者对分布式cache的理解和解决方案。 memcache完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。

二、Memcache在中型网站的使用
  使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。
  [ 分布式应用]
  Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。
  但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。
  [ 减少数据库压力]
  这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。

参考资料:http://baike.baidu.com/view/1193094.htm