PHP缓存技术
为什么要用缓存?
缓存技术是提升系统性能最有效的办法。从操作系统的临时交换区,到CPU的一二级缓存,再到硬盘显卡,缓存技术几乎无处不在。具体到web应用上,从你在浏览器地址栏里键入地址并敲下回车开始,到页面呈现在你面前,这一次网络请求,沿途各处都用到了缓存技术。DNS,路由器,负载均衡设备,代理缓存,web服务器,浏览器等都以各种不同的形式在利用缓存技术。
缓存的作用
缓存作为一种存储介质,保存上一次耗时计算的结果,当下一次相同的请求到来时,直接返回保存的结果,不用再劳驾后端服务器做一次重复劳动。这样一来,后端服务器的压力减轻了,自然能提供更多的服务,这是典型的用空间换时间的做法。
缓存的特性
有效期是缓存的必要属性,当过了有效期后,缓存失效,重新计算结果并缓存,进入下一个时效周期。
缓存内容有变化时,需主动删除缓存。
PHP缓存技术
从大的方向来说,PHP缓存可分为编译类缓存、数据类缓存、基于反向代理的web缓存和页面静态化
- 编译类缓存
常用到的编译缓存工具有Apc,Accelerator,Xcache等,其原理是将脚本编译生成的opcode予以保存,如果脚本文件没有修改,下次不用重新编译(当然具体行为与配置有关)。
对于Apc来说,在php.ini中,将apc.ttl设置为0,则表示缓存条目永不超时,这意味着缓冲区满后,将无法缓存新条目,官方建议值为7200~86400。apc.stat选项表示是否启用脚本更新检查。默认值1表示apc每次请求脚本文件时都会检查脚本是否被更新,如果更新则重新编译并缓存,这样做对性能有影响。如果设置为0,表示不检查脚本是否更新,这样能大幅提高性能,但是假如脚本文件更新了,则需要重启web服务器或者fcgi进程,默认值为1。
Apc的这种用法称之为‘系统缓存’,还有一种用法称为‘用户数据缓存’,使用方式类似memcached,在此不再展开。
- 数据类缓存
此类缓存,主要指对变量、数据库查询结果等的缓存。实现方式可以有多种,比如以资源id为键,或者以查询语句为键来存储,承载缓存数据的载体则通常是memcached,redis和文件等。
- 基于反向代理的web缓存
如Nginx的proxy_cache和fastcgi_cache,Apache2的mod_proxy和mod_cache,以及Squid和Varnish。严格来说,这并不属于PHP缓存,但是鉴于和PHP结合比较紧密,权且归到一处来。
以Nginx举例,其有两种缓存机制,proxy_cache和fastcgi_cache,两者的区别:
proxy_cache作用是缓存后端服务器的内容,可能是任何内容,包括静态的和动态的。
fastcgi_cache作用是缓存fastcgi生成的内容,很多情况是php生成的动态内容。
proxy_cache缓存减少了nginx与后端通信的次数,节省了传输时间和后端带宽。
fastcgi_cache缓存减少了nginx与php的通信次数,更减轻了php和数据库的压力。
- 页面静态化
也可称之为页面缓存,可分为全页面缓存和页面静态片段缓存。主要用到的技术为输出控制。
ob_start(); ******要运行的代码******* $content = ob_get_contents(); ****将缓存内容写入html文件***** file_put_contents(‘abc.html‘,$content); ob_end_clean();
这样用户直接访问abc.html即可。页面静态片段缓存与此类似,可以用ob实现,也可以用ESI实现。还有一种情况,页面的大部分内容是静态的,但是有一小部分内容是动态的,这怎么办呢。这种情况我们把它归属于动态缓存技术,我们下次再讲。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。